*IF DEF,MAKEBC                                                             MAKEBC1.2      
C ******************************COPYRIGHT******************************    MAKEBC1.3      
C (c) CROWN COPYRIGHT 1997, METEOROLOGICAL OFFICE, All Rights Reserved.    MAKEBC1.4      
C                                                                          MAKEBC1.5      
C Use, duplication or disclosure of this code is subject to the            MAKEBC1.6      
C restrictions as set forth in the contract.                               MAKEBC1.7      
C                                                                          MAKEBC1.8      
C                Meteorological Office                                     MAKEBC1.9      
C                London Road                                               MAKEBC1.10     
C                BRACKNELL                                                 MAKEBC1.11     
C                Berkshire UK                                              MAKEBC1.12     
C                RG12 2SZ                                                  MAKEBC1.13     
C                                                                          MAKEBC1.14     
C If no contract has been raised with this copy of the code, the use,      MAKEBC1.15     
C duplication or disclosure of it is strictly prohibited.  Permission      MAKEBC1.16     
C to do so must first be obtained in writing from the Head of Numerical    MAKEBC1.17     
C Modelling at the above address.                                          MAKEBC1.18     
C                                                                          MAKEBC1.19     
C *********************************************************************    MAKEBC1.20     
!+ Program MAKEBC : Top-level program to create boundary dataset           MAKEBC1.21     
!                   from model analyses/dumps.                             MAKEBC1.22     
!                                                                          MAKEBC1.23     

      Program MAIN_MAKEBC                                                  ,5MAKEBC1.24     
                                                                           MAKEBC1.25     
      IMPLICIT NONE                                                        MAKEBC1.26     
!                                                                          MAKEBC1.27     
! Description : Create a boundary dataset from UM model analyses           MAKEBC1.28     
!               or dumps.                                                  MAKEBC1.29     
!                                                                          MAKEBC1.30     
! Method : For each dump, boundary conditions are generated through        MAKEBC1.31     
!          GEN_INTF for the area specified in the INFTCNST namelist.       MAKEBC1.32     
!          This routine initialises various variables in TYPSIZE           MAKEBC1.33     
!          before it can be used in the lower routines.                    MAKEBC1.34     
!                                                                          MAKEBC1.35     
! Current Code Owner : Dave Robinson, NWP                                  MAKEBC1.36     
!                                                                          MAKEBC1.37     
! History :                                                                MAKEBC1.38     
! Version    Date    Comment                                               MAKEBC1.39     
! -------    ----    -------                                               MAKEBC1.40     
!   4.4    10/10/97  Original Code                                         MAKEBC1.41     
!   4.5    07/08/98  Call new subroutine LOOP_OVER_DUMPS from MAKEBC.      UDR3F405.19     
!                    Adapt to new 4.5 changes. Use new unit number 140.    UDR3F405.20     
!                    Call new routine DERV_INTF_A. Rename CINTF to         UDR3F405.21     
!                    CINTFA. Read in env var UM_SECTOR_SIZE.               UDR3F405.22     
!                    D. Robinson.                                          UDR3F405.23     
!                                                                          MAKEBC1.42     
! Code Description :                                                       MAKEBC1.43     
! Language : FORTRAN 77 + common extensions                                MAKEBC1.44     
! This code is written to UMDP3 v6 programming standards.                  MAKEBC1.45     
!                                                                          MAKEBC1.46     
! Declarations :                                                           MAKEBC1.47     
!                                                                          MAKEBC1.48     
      Integer internal_model   !  Internal Model Identifier                MAKEBC1.49     
      Integer ppxRecs          !  No of stashmaster records                MAKEBC1.50     
      Integer icode            !  Error code                               MAKEBC1.51     
                                                                           MAKEBC1.52     
      Character*80 cmessage    !  Error Message                            MAKEBC1.53     
      Character*8  c_um_sector_size  ! Char variable to read env var       UDR3F405.24     
                                                                           MAKEBC1.54     
*CALL TYPSIZE                                                              MAKEBC1.55     
*CALL CSUBMODL                                                             MAKEBC1.56     
*CALL CNTL_IO                                                              UDR3F405.25     
                                                                           MAKEBC1.57     
!   Function & Subroutine calls                                            MAKEBC1.58     
                                                                           MAKEBC1.59     
      EXTERNAL HDPPXRF,MAKEBC                                              MAKEBC1.60     
                                                                           MAKEBC1.61     
!-  End of header                                                          MAKEBC1.62     
                                                                           MAKEBC1.63     
      write (6,*) ' ##########################################'            MAKEBC1.64     
      write (6,*) ' Running MAKEBC Utility to create a'                    MAKEBC1.65     
      write (6,*) ' Boundary Dataset from Model Analyses/Dumps'            MAKEBC1.66     
      write (6,*) ' ##########################################'            MAKEBC1.67     
      write (6,*) ' '                                                      MAKEBC1.68     
                                                                           MAKEBC1.69     
      icode = 0                                                            MAKEBC1.70     
                                                                           MAKEBC1.71     
!     Only Atmosphere Model catered for                                    MAKEBC1.72     
      n_internal_model = 1                                                 MAKEBC1.73     
      internal_model = 1                                                   MAKEBC1.74     
      internal_model_index(internal_model) = 1                             MAKEBC1.75     
                                                                           MAKEBC1.76     
!     Determine no of Atmos records in STASHmaster file                    MAKEBC1.77     
      ppxRecs=1                                                            MAKEBC1.78     
      call hdppxrf(22,'STASHmaster_A',ppxRecs,icode,cmessage)              MAKEBC1.79     
      if (icode.gt.0) then                                                 MAKEBC1.80     
        write (6,*) 'Error in HDPPXRF for STASHmaster_A.'                  MAKEBC1.81     
        go to 9999                                                         MAKEBC1.82     
      endif                                                                MAKEBC1.83     
                                                                           MAKEBC1.84     
!     Get the current sector size for disk I/O                             UDR3F405.26     
      CALL FORT_GET_ENV('UM_SECTOR_SIZE',14,c_um_sector_size,8,icode)      UDR3F405.27     
      IF (icode .NE. 0) THEN                                               UDR3F405.28     
        WRITE(6,*) ' Warning : Environment variable UM_SECTOR_SIZE',       UDR3F405.29     
     &             ' has not been set.'                                    UDR3F405.30     
        WRITE(6,*) ' Setting UM_SECTOR_SIZE to 2048'                       UDR3F405.31     
        um_sector_size=2048                                                UDR3F405.32     
      ELSE                                                                 UDR3F405.33     
        READ(c_um_sector_size,'(I4)') um_sector_size                       UDR3F405.34     
        write (6,*) ' '                                                    UDR3F405.35     
        write (6,*) ' UM_SECTOR_SIZE is set to ',um_sector_size            UDR3F405.36     
      ENDIF                                                                UDR3F405.37     
                                                                           UDR3F405.38     
!     Initialise variables in TYPSIZE                                      MAKEBC1.85     
      nsects = 20                                                          MAKEBC1.86     
      nitems = 20                                                          MAKEBC1.87     
      n_req_items = 20                                                     MAKEBC1.88     
      n_ppxrecs = 20                                                       MAKEBC1.89     
      totitems = 20                                                        MAKEBC1.90     
      nsttims = 20                                                         MAKEBC1.91     
      nsttabl = 20                                                         MAKEBC1.92     
      num_stash_pseudo = 1                                                 MAKEBC1.93     
      num_pseudo_lists = 1                                                 MAKEBC1.94     
      nstash_series_records = 1                                            MAKEBC1.95     
      nstash_series_block = 1                                              MAKEBC1.96     
      mos_mask_len = 1                                                     MAKEBC1.97     
                                                                           MAKEBC1.98     
!     Dimensions of Headers in Boundary dataset                            MAKEBC1.99     
!     Integer/Real Constants                                               MAKEBC1.100    
      pp_len_inthd = 15                                                    MAKEBC1.101    
      pp_len_realhd = 6                                                    MAKEBC1.102    
!     Level Dependent Constants array (Second dimension)                   MAKEBC1.103    
      intf_len2_levdepc = 4                                                MAKEBC1.104    
                                                                           MAKEBC1.111    
!     No of areas requiring boundary conditions.                           UDR3F405.39     
!     More than one area not tested yet.                                   UDR3F405.40     
      n_intf_a = 1                                                         UDR3F405.41     
                                                                           UDR3F405.42     
!     Derive data lengths.                                                 UDR3F405.43     
!     U_FIELD is not known yet : Set to 1 for DERV_INTF_A                  UDR3F405.44     
      U_FIELD = 1                                                          UDR3F405.45     
                                                                           UDR3F405.46     
      CALL DERV_INTF_A (TOT_LEN_INTFA_P,TOT_LEN_INTFA_U,                   UDR3F405.47     
     &     MAX_INTF_P_LEVELS,N_INTF_A,U_FIELD,U_FIELD_INTFA)               UDR3F405.48     
                                                                           UDR3F405.49     
!     Length of super arrays.                                              MAKEBC1.112    
      len_a_spsts =1                                                       MAKEBC1.113    
      len_a_ixsts =1                                                       MAKEBC1.114    
                                                                           MAKEBC1.115    
      call makebc(ppxRecs,icode,cmessage)                                  MAKEBC1.116    
                                                                           MAKEBC1.117    
 9999 continue                                                             MAKEBC1.118    
                                                                           MAKEBC1.119    
      if (icode.gt.0) then                                                 MAKEBC1.120    
        write (6,*) ' '                                                    MAKEBC1.121    
        write (6,*) ' ##################################'                  MAKEBC1.122    
        write (6,*) ' Error in MAKEBC Program.'                            MAKEBC1.123    
        write (6,*) ' ICODE = ',ICODE                                      MAKEBC1.124    
        write (6,*) ' CMESSAGE = ',CMESSAGE                                MAKEBC1.125    
        write (6,*) ' ##################################'                  MAKEBC1.126    
        call abort                                                         MAKEBC1.127    
      endif                                                                MAKEBC1.128    
                                                                           MAKEBC1.129    
      write (6,*) ' '                                                      MAKEBC1.130    
      write (6,*) ' ##################################'                    MAKEBC1.131    
      write (6,*) ' MAKEBC program completed normally.'                    MAKEBC1.132    
      write (6,*) ' ##################################'                    MAKEBC1.133    
                                                                           MAKEBC1.134    
      stop                                                                 MAKEBC1.135    
      end                                                                  MAKEBC1.136    
                                                                           MAKEBC1.137    
                                                                           MAKEBC1.138    
!+ Subroutine MAKEBC : Creates a boundary dataset from model dumps         MAKEBC1.139    
!                                                                          MAKEBC1.140    
! Subroutine Interface :                                                   MAKEBC1.141    

      subroutine makebc(ppxRecs,icode,cmessage)                             1,3MAKEBC1.142    
                                                                           MAKEBC1.143    
      IMPLICIT NONE                                                        MAKEBC1.144    
!                                                                          MAKEBC1.145    
! Description : Control routine for MAKEBC utility.                        MAKEBC1.146    
!                                                                          MAKEBC1.147    
! Method : Read in DUMP2BOUND namelist. Call INTF_CTL which reads          MAKEBC1.148    
!          in INTFCNST namelist. Loop over dumps to generate               MAKEBC1.149    
!          boundary conditions.                                            MAKEBC1.150    
!                                                                          MAKEBC1.151    
! Current Code Owner : Dave Robinson, NWP                                  MAKEBC1.152    
!                                                                          MAKEBC1.153    
! History :                                                                MAKEBC1.154    
! Version    Date    Comment                                               MAKEBC1.155    
! -------    ----    -------                                               MAKEBC1.156    
!   4.4    10/10/97  Original Code                                         MAKEBC1.157    
!                                                                          MAKEBC1.158    
! Code Description :                                                       MAKEBC1.159    
! Language : FORTRAN 77 + common extensions                                MAKEBC1.160    
! This code is written to UMDP3 v6 programming standards.                  MAKEBC1.161    
!                                                                          MAKEBC1.162    
! Declarations :                                                           MAKEBC1.163    
!                                                                          MAKEBC1.164    
! Global Variables :                                                       MAKEBC1.165    
!                                                                          MAKEBC1.166    
*CALL TYPSIZE                                                              MAKEBC1.167    
*CALL CSUBMODL                                                             MAKEBC1.168    
*CALL CMAXSIZE                                                             MAKEBC1.169    
*CALL CHSUNITS                                                             MAKEBC1.170    
*CALL CHISTORY                                                             MAKEBC1.171    
*CALL CTIME                                                                MAKEBC1.172    
*CALL CLOOKADD                                                             MAKEBC1.173    
*CALL C_MDI                                                                MAKEBC1.174    
*CALL CCONTROL                                                             MAKEBC1.175    
*CALL CINTFA                                                               UDR3F405.50     
*CALL TYPINFA                                                              UDR3F405.51     
*CALL CPPXREF                                                              MAKEBC1.177    
*CALL PPXLOOK                                                              MAKEBC1.178    
                                                                           MAKEBC1.179    
! Subroutine arguments                                                     MAKEBC1.180    
!   Scalar arguments with intent(in) :                                     MAKEBC1.181    
                                                                           MAKEBC1.182    
!   Array arguments with intent(in) :                                      MAKEBC1.183    
                                                                           MAKEBC1.184    
!   Scalar arguments with intent(inout) :                                  MAKEBC1.185    
                                                                           MAKEBC1.186    
!   Array arguments with intent(inout) :                                   MAKEBC1.187    
                                                                           MAKEBC1.188    
!   Scalar arguments with intent(out) :                                    MAKEBC1.189    
                                                                           MAKEBC1.190    
      Integer icode            !  Error code                               MAKEBC1.191    
      Character*80 cmessage    !  Error Message                            MAKEBC1.192    
                                                                           MAKEBC1.193    
!   Array arguments with intent(out) :                                     MAKEBC1.194    
                                                                           MAKEBC1.195    
!   Local parameters :                                                     MAKEBC1.196    
                                                                           MAKEBC1.197    
!   Local scalars :                                                        MAKEBC1.198    
                                                                           MAKEBC1.199    
      Integer j,jintf          !  Loop indices                             UDR3F405.52     
      Integer irow_number      !  Row number, required for GETPPX          MAKEBC1.204    
      Integer internal_model   !  Internal Model Identifier                MAKEBC1.205    
                                                                           MAKEBC1.208    
!     Required for I/O                                                     MAKEBC1.209    
      Integer unit_no_bc  !  Unit No for boundary dataset                  MAKEBC1.211    
                                                                           MAKEBC1.220    
!   Local dynamic arrays :                                                 MAKEBC1.221    
                                                                           MAKEBC1.222    
!   Namelists :                                                            MAKEBC1.226    
                                                                           MAKEBC1.227    
!     DUMP2BOUND namelist for MAKEBC Program                               MAKEBC1.228    
      Integer  n_dumps      !  No of model dumps                           MAKEBC1.229    
      Integer  nhours       !  No of hours between dumps                   MAKEBC1.230    
      Integer  um_versn     !  UM Version Boundary Dataset for             MAKEBC1.231    
                                                                           MAKEBC1.232    
!     lcal360/l_lspice  defined in CNTLALL/CNTLATM                         MAKEBC1.233    
                                                                           MAKEBC1.234    
      NAMELIST /DUMP2BOUND/ n_dumps,nhours,um_versn,lcal360,l_lspice       MAKEBC1.235    
                                                                           MAKEBC1.236    
!   Function & Subroutine calls                                            MAKEBC1.237    
                                                                           MAKEBC1.238    
      EXTERNAL getppx,intf_ctl,loop_over_dumps                             PXMAKEBC.1      
                                                                           MAKEBC1.241    
!-  End of Header                                                          MAKEBC1.242    
                                                                           MAKEBC1.243    
!     Defaults for DUMP2BOUND namelist                                     MAKEBC1.244    
      n_dumps  = 0                                                         MAKEBC1.245    
      nhours   = 0                                                         MAKEBC1.246    
      um_versn = 403                                                       MAKEBC1.247    
      lcal360  = .false.                                                   MAKEBC1.248    
      l_lspice = .false.                                                   MAKEBC1.249    
                                                                           MAKEBC1.250    
!     Read in namelist and print                                           MAKEBC1.251    
      rewind 5                                                             MAKEBC1.252    
      read  (5,DUMP2BOUND)                                                 MAKEBC1.253    
      write (6,*) ' '                                                      MAKEBC1.254    
      write (6,*) 'Namelist DUMPBOUND read in '                            MAKEBC1.255    
      write (6,DUMP2BOUND)                                                 MAKEBC1.256    
                                                                           MAKEBC1.257    
!     Check namelist                                                       MAKEBC1.258    
      if (n_dumps.eq.0 .or. nhours.eq.0) then                              MAKEBC1.259    
        write (6,*) ' Error in setting DUMP2BOUND namelist'                MAKEBC1.260    
        write (6,*) ' Both N_DUMPS and NHOURS must be set'                 MAKEBC1.261    
        write (6,*) ' N_DUMPS ',N_DUMPS,' NHOURS ',NHOURS                  MAKEBC1.262    
        go to 9999  !  Return                                              MAKEBC1.263    
      endif                                                                MAKEBC1.264    
                                                                           MAKEBC1.265    
      internal_model = 1                                                   MAKEBC1.266    
                                                                           MAKEBC1.271    
!     Initialise LLBOUTim in CNTLGEN                                       MAKEBC1.272    
      LLBOUTim(internal_model)=.true.                                      MAKEBC1.273    
                                                                           MAKEBC1.274    
!     Initialise variables to nullify A_STEPS_PER_HR in INTF_CTL           MAKEBC1.275    
      STEPS_PER_PERIODim(internal_model) = 1                               MAKEBC1.276    
      SECS_PER_PERIODim(internal_model)  = 3600                            MAKEBC1.277    
                                                                           MAKEBC1.278    
!     Initialise STEPIM to correspond to first dump                        MAKEBC1.279    
      STEPim(internal_model)=0                                             MAKEBC1.280    
                                                                           MAKEBC1.281    
!     Use UM Unit No 140-147 for Atmos Boundary Datasets 1-8               UDR3F405.54     
      unit_no_bc = 140                                                     UDR3F405.55     
                                                                           MAKEBC1.285    
!     Initialise variables in CNTLALL for this unit no.                    MAKEBC1.286    
!     Reinitialising of boundary dataset not supported yet.                MAKEBC1.287    
      TYPE_LETTER_1(unit_no_bc) = 'b'                                      UDR3F405.56     
      FT_STEPS(unit_no_bc)      = 0                                        MAKEBC1.290    
      FT_FIRSTSTEP(unit_no_bc)  = 0                                        MAKEBC1.291    
      DO J =140,147                                                        UDR3F405.57     
      FT_OUTPUT = 'N'                                                      UDR3F405.58     
      ENDDO                                                                UDR3F405.59     
                                                                           MAKEBC1.292    
      write (6,*) ' '                                                      MAKEBC1.293    
      write (6,*) ' Calling INTF_CTL to read in INTFCNSTA namelist.'       UDR3F405.60     
                                                                           MAKEBC1.295    
!     Get model grid for which boundary conditions are required            MAKEBC1.296    
      call intf_ctl (                                                      MAKEBC1.297    
*CALL ARGSIZE                                                              MAKEBC1.298    
*CALL ARGINFA                                                              UDR3F405.61     
     +               icode,cmessage)                                       MAKEBC1.299    
                                                                           MAKEBC1.300    
!     Print out INTFCNTL namelist variables (Read in intf_ctl)             MAKEBC1.301    
      write (6,*) ' '                                                      MAKEBC1.302    
      write (6,*) ' Namelist INTFCNSTA read in'                            UDR3F405.62     
      do jintf=1,n_intf_a                                                  MAKEBC1.304    
      write (6,*) ' For area ',jintf                                       MAKEBC1.305    
      write (6,*) ' a_intf_start_hr  ',A_INTF_START_HR(JINTF)              MAKEBC1.306    
      write (6,*) ' a_intf_freq_hr   ',A_INTF_FREQ_HR(JINTF)               MAKEBC1.307    
      write (6,*) ' a_intf_end_hr    ',A_INTF_END_HR(JINTF)                MAKEBC1.308    
      write (6,*) ' intf_p_rows      ',INTF_P_ROWS(JINTF)                  MAKEBC1.309    
      write (6,*) ' intf_row_length  ',INTF_ROW_LENGTH(JINTF)              MAKEBC1.310    
      write (6,*) ' intf_p_levels    ',INTF_P_LEVELS(JINTF)                MAKEBC1.311    
      write (6,*) ' intf_q_levels    ',INTF_Q_LEVELS(JINTF)                MAKEBC1.312    
      write (6,*) ' intf_tr_levels   ',INTF_TR_LEVELS(JINTF)               MAKEBC1.313    
      write (6,*) ' intf_firstlat    ',INTF_FIRSTLAT(JINTF)                MAKEBC1.314    
      write (6,*) ' intf_firstlong   ',INTF_FIRSTLONG(JINTF)               MAKEBC1.315    
      write (6,*) ' intf_nsspace     ',INTF_NSSPACE(JINTF)                 MAKEBC1.316    
      write (6,*) ' intf_ewspace     ',INTF_EWSPACE(JINTF)                 MAKEBC1.317    
      write (6,*) ' intf_polelat     ',INTF_POLELAT(JINTF)                 MAKEBC1.318    
      write (6,*) ' intf_polelong    ',INTF_POLELONG(JINTF)                MAKEBC1.319    
      write (6,*) ' intf_pack        ',INTF_PACK(JINTF)                    MAKEBC1.320    
      write (6,*) ' intfwidtha       ',INTFWIDTHA(JINTF)                   MAKEBC1.321    
      write (6,*) ' intf_vert_interp ',INTF_VERT_INTERP(JINTF)             MAKEBC1.322    
      enddo                                                                MAKEBC1.323    
                                                                           MAKEBC1.324    
                                                                           MAKEBC1.341    
!     No of data types for which boundary conditions required.             MAKEBC1.342    
!     Assume no tracer variables.                                          MAKEBC1.343    
      tr_vars  = 0                                                         MAKEBC1.344    
      if (l_lspice) then                                                   MAKEBC1.345    
        intf_lookupsa = 6+tr_vars                                          MAKEBC1.346    
      else                                                                 MAKEBC1.347    
        intf_lookupsa = 5+tr_vars                                          MAKEBC1.348    
      endif                                                                MAKEBC1.349    
                                                                           MAKEBC1.350    
!     No timer info required                                               MAKEBC1.351    
      ltimer = .false.                                                     MAKEBC1.352    
                                                                           MAKEBC1.353    
!     Read StashMaster file                                                MAKEBC1.354    
      irow_number=0                                                        MAKEBC1.355    
      call getppx (22,2,'STASHmaster_A',irow_number,                       MAKEBC1.356    
*CALL ARGPPX                                                               MAKEBC1.357    
     &  icode,cmessage)                                                    MAKEBC1.358    
                                                                           MAKEBC1.359    
      if (icode.gt.0) then                                                 MAKEBC1.360    
        write (6,*) 'Error in GETPPX.'                                     MAKEBC1.361    
        go to 9999  !  Return                                              MAKEBC1.362    
      endif                                                                MAKEBC1.363    
                                                                           MAKEBC1.364    
       call loop_over_dumps (n_dumps,nhours,unit_no_bc,um_versn,           UDR3F405.63     
     &      intf_akh,intf_bkh,intf_ak,intf_bk,                             UDR3F405.64     
*CALL ARGSIZE                                                              UDR3F405.65     
*CALL ARGPPX                                                               UDR3F405.66     
     &      icode,cmessage)                                                UDR3F405.67     
       if (icode.gt.0) then                                                UDR3F405.68     
         write (6,*) ' Error in LOOP_OVER_DUMPS '                          UDR3F405.69     
         go to 9999   ! Return                                             UDR3F405.70     
       endif                                                               UDR3F405.71     
                                                                           UDR3F405.72     
 9999  continue                                                            UDR3F405.73     
                                                                           UDR3F405.74     
       return                                                              UDR3F405.75     
       end                                                                 UDR3F405.76     
                                                                           UDR3F405.77     
!+ Subroutine LOOP_OVER_DUMPS : Loop over dumps to get boundary data       UDR3F405.78     
!                                                                          UDR3F405.79     
! Subroutine Interface :                                                   UDR3F405.80     

       subroutine loop_over_dumps (n_dumps,nhours,unit_no_bc,um_versn,      1,11UDR3F405.81     
     &            intf_akh,intf_bkh,intf_ak,intf_bk,                       UDR3F405.82     
*CALL ARGSIZE                                                              UDR3F405.83     
*CALL ARGPPX                                                               UDR3F405.84     
     &            icode,cmessage)                                          UDR3F405.85     
                                                                           UDR3F405.86     
      IMPLICIT NONE                                                        UDR3F405.87     
!                                                                          UDR3F405.88     
! Description : Loop over the dumps and get the boundary conditions        UDR3F405.89     
!                                                                          UDR3F405.90     
! Method : For each dump, GET_BC is called to read in the data from        UDR3F405.91     
!          the dump and generate the boundary conditions.                  UDR3F405.92     
!                                                                          UDR3F405.93     
! Current Code Owner : Dave Robinson, NWP                                  UDR3F405.94     
!                                                                          UDR3F405.95     
! History :                                                                UDR3F405.96     
! Version    Date    Comment                                               UDR3F405.97     
! -------    ----    -------                                               UDR3F405.98     
!   4.5    18/02/98  Subroutine MAKEBC in 4.4 split into MAKEBC and        UDR3F405.99     
!                    LOOP_OVER_DUMPS. D. Robinson.                         UDR3F405.100    
!                                                                          UDR3F405.101    
! Code Description :                                                       UDR3F405.102    
! Language : FORTRAN 77 + common extensions                                UDR3F405.103    
! This code is written to UMDP3 v6 programming standards.                  UDR3F405.104    
!                                                                          UDR3F405.105    
! Declarations :                                                           UDR3F405.106    
!                                                                          UDR3F405.107    
! Global Variables :                                                       UDR3F405.108    
!                                                                          UDR3F405.109    
*CALL CMAXSIZE                                                             UDR3F405.110    
*CALL TYPSIZE                                                              UDR3F405.111    
*CALL CHSUNITS                                                             UDR3F405.112    
*CALL CSUBMODL                                                             UDR3F405.113    
*CALL CPPXREF                                                              UDR3F405.114    
*CALL PPXLOOK                                                              UDR3F405.115    
*CALL CTIME                                                                UDR3F405.116    
*CALL CNTLALL                                                              UDR3F405.117    
                                                                           UDR3F405.118    
! Subroutine arguments                                                     UDR3F405.119    
!   Scalar arguments with intent(in) :                                     UDR3F405.120    
                                                                           UDR3F405.121    
      Integer n_dumps     ! No of model dumps                              UDR3F405.122    
      Integer nhours      ! No of hours between dumps                      UDR3F405.123    
      Integer unit_no_bc  ! Unit No for Boundary dataset                   UDR3F405.124    
      Integer um_versn    ! UM Version Boundary dataset for                UDR3F405.125    
                                                                           UDR3F405.126    
!   Array arguments with intent(in) :                                      UDR3F405.127    
                                                                           UDR3F405.128    
      Real Intf_akh (max_intf_p_levels+1,n_intf_a)                         UDR3F405.129    
      Real Intf_bkh (max_intf_p_levels+1,n_intf_a)                         UDR3F405.130    
      Real Intf_ak  (max_intf_p_levels  ,n_intf_a)                         UDR3F405.131    
      Real Intf_bk  (max_intf_p_levels  ,n_intf_a)                         UDR3F405.132    
                                                                           UDR3F405.133    
!   Scalar arguments with intent(inout) :                                  UDR3F405.134    
                                                                           UDR3F405.135    
!   Array arguments with intent(inout) :                                   UDR3F405.136    
                                                                           UDR3F405.137    
!   Scalar arguments with intent(out) :                                    UDR3F405.138    
                                                                           UDR3F405.139    
!   Array arguments with intent(out) :                                     UDR3F405.140    
                                                                           UDR3F405.141    
      Integer icode          ! Error code                                  UDR3F405.142    
      Character*80 cmessage  ! Error Message                               UDR3F405.143    
                                                                           UDR3F405.144    
!   Local parameters                                                       UDR3F405.145    
                                                                           UDR3F405.146    
!   Local scalars                                                          UDR3F405.147    
                                                                           UDR3F405.148    
      Integer unit_no        !  Unit no for input dump                     UDR3F405.149    
      Integer len_env        !  Length of env. variable                    UDR3F405.150    
      Integer env_var        !  Indicator that filename is in env var      UDR3F405.151    
      Integer read_only      !  Input dumps - read only                    UDR3F405.152    
      Integer read_write     !  Output Boundary File - read & write        UDR3F405.153    
      Character*6 env        !  Env Variable for input dump filename       UDR3F405.154    
                                                                           UDR3F405.155    
      data read_only/0/, read_write/1/, len_env/6/, env_var/0/             UDR3F405.156    
                                                                           UDR3F405.157    
      Integer j,jdump        !  Loop indices                               UDR3F405.158    
      Integer inthd(15)      !  Integer Constants array                    UDR3F405.159    
      Integer yy,mm,dd,hr,mn,ss,day_no  !  Time/date for first dump        UDR3F405.160    
      Integer elapsed_days   !  No of days elapsed                         UDR3F405.161    
      Integer elapsed_secs   !  No of secs elapsed                         UDR3F405.162    
      Integer len_actual     !  Length of data read in BUFFIN              UDR3F405.163    
      Real a                 !  Return code from BUFFIN                    UDR3F405.164    
                                                                           UDR3F405.165    
!   Local dynamic arrays                                                   UDR3F405.166    
                                                                           UDR3F405.167    
      Integer fixhd(len_fixhd)  !  Fixed header from dump                  UDR3F405.168    
      Integer Fixhd_intfa(len_fixhd,n_intf_a)                              UDR3F405.169    
                                !  Fixed headers for boundary files        UDR3F405.170    
      Integer Inthd_intfa(pp_len_inthd,n_intf_a)                           UDR3F405.171    
                                !  Integer headers for boundary files      UDR3F405.172    
      Integer Lookup_intfa(len1_lookup,intf_lookupsa,n_intf_a)             UDR3F405.173    
                                !  Lookup Tables for boundary files        UDR3F405.174    
      Real Realhd_intfa(pp_len_realhd,n_intf_a)                            UDR3F405.175    
                                !  Real headers for boundary files         UDR3F405.176    
      Real Levdepc_intfa(max_intf_p_levels,intf_len2_levdepc,n_intf_a)     UDR3F405.177    
                                !  Level Dep Const for boundary files      UDR3F405.178    
                                                                           UDR3F405.179    
!   Function & Subroutine calls                                            UDR3F405.180    
                                                                           UDR3F405.181    
      EXTERNAL buffin,file_open,get_bc,read_flh,                           UDR3F405.182    
     &         sec2time,setpos,time2sec                                    UDR3F405.183    
                                                                           UDR3F405.184    
!-  End of Header                                                          UDR3F405.185    
                                                                           UDR3F405.186    
!     Open Boundary Dataset                                                MAKEBC1.365    
      write (6,*) ' '                                                      MAKEBC1.366    
      call file_open                                                       MAKEBC1.367    
     &   (unit_no_bc,'BCFILE',len_env,read_write,env_var,icode)            MAKEBC1.368    
      if (icode.ne.0) then                                                 MAKEBC1.369    
        write (6,*) 'Error in opening Boundary Dataset on unit no ',       MAKEBC1.370    
     &  unit_no_bc                                                         MAKEBC1.371    
        go to 9999  !  Return                                              MAKEBC1.372    
      endif                                                                MAKEBC1.373    
                                                                           MAKEBC1.374    
!     Loop over model dumps                                                MAKEBC1.375    
      do jdump=1,n_dumps                                                   MAKEBC1.376    
      write (6,*) ' '                                                      MAKEBC1.377    
      write (6,*) ' Processing dump no ',jdump                             MAKEBC1.378    
                                                                           MAKEBC1.379    
!     Unit number for this dump                                            MAKEBC1.380    
      unit_no = jdump+30                                                   MAKEBC1.381    
                                                                           MAKEBC1.382    
!     Open the dump                                                        MAKEBC1.383    
      env = 'FILE  '                                                       MAKEBC1.384    
      write (env(5:6),'(I2)') unit_no                                      MAKEBC1.385    
      write (6,*) ' '                                                      MAKEBC1.386    
      call file_open (unit_no,env,len_env,read_only,env_var,icode)         MAKEBC1.387    
      if (icode.ne.0) then                                                 MAKEBC1.388    
        write (6,*) 'Error in opening dump on unit no ',unit_no            MAKEBC1.389    
        go to 9999  !  Return                                              MAKEBC1.390    
      endif                                                                MAKEBC1.391    
                                                                           MAKEBC1.392    
!     Set STEPim(1) for this dump (controlled by nhours)                   MAKEBC1.393    
      STEPim(1) = INTERFACE_FSTEPim(1,1) + (jdump-1)*nhours                MAKEBC1.394    
                                                                           MAKEBC1.395    
!     Read in fixed header from this dump                                  MAKEBC1.396    
      call setpos (unit_no,0,icode)                                        MAKEBC1.397    
      if (icode.gt.0) then                                                 MAKEBC1.398    
        write (6,*) 'Error in SETPOS for Fixed Header.'                    MAKEBC1.399    
        go to 9999  !  Return                                              MAKEBC1.400    
      endif                                                                MAKEBC1.401    
                                                                           MAKEBC1.402    
      call read_flh (unit_no,fixhd,len_fixhd,icode,cmessage)               MAKEBC1.403    
      if (icode.gt.0) then                                                 MAKEBC1.404    
        write (6,*) 'Error in READ_FLH for dump ',jdump                    MAKEBC1.405    
        go to 9999  !  Return                                              MAKEBC1.406    
      endif                                                                MAKEBC1.407    
                                                                           MAKEBC1.408    
!     For first dump only                                                  MAKEBC1.409    
!     Set model basis time to be date/time in first dump and use           MAKEBC1.410    
!     to initialise variables required for time processing                 MAKEBC1.411    
      if (jdump.eq.1) then                                                 MAKEBC1.412    
                                                                           MAKEBC1.413    
        model_basis_time(1)=fixhd(21)                                      MAKEBC1.414    
        model_basis_time(2)=fixhd(22)                                      MAKEBC1.415    
        model_basis_time(3)=fixhd(23)                                      MAKEBC1.416    
        model_basis_time(4)=fixhd(24)                                      MAKEBC1.417    
        model_basis_time(5)=0                                              MAKEBC1.418    
        model_basis_time(6)=0                                              MAKEBC1.419    
                                                                           MAKEBC1.420    
        i_year   = model_basis_time(1)                                     MAKEBC1.421    
        i_month  = model_basis_time(2)                                     MAKEBC1.422    
        i_day    = model_basis_time(3)                                     MAKEBC1.423    
        i_hour   = model_basis_time(4)                                     MAKEBC1.424    
        i_minute = model_basis_time(5)                                     MAKEBC1.425    
        i_second = model_basis_time(6)                                     MAKEBC1.426    
                                                                           MAKEBC1.427    
        basis_time_days = 0                                                MAKEBC1.428    
        basis_time_secs = 0                                                MAKEBC1.429    
        call time2sec(i_year,i_month,i_day,i_hour,i_minute,i_second,       MAKEBC1.430    
     +     basis_time_days,basis_time_secs,elapsed_days,elapsed_secs,      MAKEBC1.431    
     +     lcal360)                                                        MAKEBC1.432    
                                                                           MAKEBC1.433    
        basis_time_days = elapsed_days                                     MAKEBC1.436    
        basis_time_secs = elapsed_secs                                     MAKEBC1.437    
        elapsed_days = 0                                                   MAKEBC1.438    
        elapsed_secs = 0                                                   MAKEBC1.439    
        call sec2time(elapsed_days,elapsed_secs,                           MAKEBC1.440    
     +                basis_time_days,basis_time_secs,                     MAKEBC1.441    
     +                yy,mm,dd,hr,mn,ss,day_no,lcal360)                    MAKEBC1.442    
                                                                           MAKEBC1.443    
      endif                                                                MAKEBC1.444    
                                                                           MAKEBC1.445    
!     Remove negative dimensions, if any.                                  MAKEBC1.446    
      do j=100,256                                                         MAKEBC1.447    
      if (fixhd(j).lt.0) fixhd(j)=0                                        MAKEBC1.448    
      enddo                                                                MAKEBC1.449    
                                                                           MAKEBC1.450    
!     Get header dimensions from Fixed Header                              MAKEBC1.451    
      a_len_inthd    = fixhd(101)                                          MAKEBC1.452    
      a_len_realhd   = fixhd(106)                                          MAKEBC1.453    
      a_len1_levdepc = fixhd(111)                                          MAKEBC1.454    
      a_len2_levdepc = fixhd(112)                                          MAKEBC1.455    
      a_len1_rowdepc = fixhd(116)                                          MAKEBC1.456    
      a_len2_rowdepc = fixhd(117)                                          MAKEBC1.457    
      a_len1_coldepc = fixhd(121)                                          MAKEBC1.458    
      a_len2_coldepc = fixhd(122)                                          MAKEBC1.459    
      a_len1_flddepc = fixhd(126)                                          MAKEBC1.460    
      a_len2_flddepc = fixhd(127)                                          MAKEBC1.461    
      a_len_extcnst  = fixhd(131)                                          MAKEBC1.462    
      a_len_cfi1     = fixhd(141)                                          MAKEBC1.463    
      a_len_cfi2     = fixhd(143)                                          MAKEBC1.464    
      a_len_cfi3     = fixhd(145)                                          MAKEBC1.465    
      a_len2_lookup  = fixhd(152)                                          MAKEBC1.466    
      a_len_data     = fixhd(161)                                          MAKEBC1.467    
                                                                           MAKEBC1.468    
!     Get length of data in this dump                                      MAKEBC1.469    
      len_tot  = a_len_data                                                MAKEBC1.470    
                                                                           MAKEBC1.471    
!     Read in Integer Constants for this dump                              MAKEBC1.472    
      call setpos(unit_no,fixhd(100)-1,icode)                              MAKEBC1.473    
      if (icode.gt.0) then                                                 MAKEBC1.474    
        write (6,*) 'Error in SETPOS for Integer Constants array.'         MAKEBC1.475    
        go to 9999  !  Return                                              MAKEBC1.476    
      endif                                                                MAKEBC1.477    
                                                                           MAKEBC1.478    
      call buffin (unit_no,inthd(1),15,len_actual,a)                       MAKEBC1.479    
      if (a.ne.-1.0) then                                                  MAKEBC1.480    
        write (6,*) 'Problem with reading Integer Constants array.'        MAKEBC1.481    
        write (6,*) 'Return code from buffin = ',a                         MAKEBC1.482    
        write (6,*) 'Length of data read by buffin = ',len_actual          MAKEBC1.483    
        go to 9999  !  Return                                              MAKEBC1.484    
      endif                                                                MAKEBC1.485    
                                                                           MAKEBC1.486    
!     Get model grid for this dump                                         MAKEBC1.487    
      row_length = inthd(6)                                                MAKEBC1.488    
      p_rows     = inthd(7)                                                MAKEBC1.489    
      u_rows     = p_rows-1                                                MAKEBC1.490    
      p_field    = row_length * p_rows                                     MAKEBC1.491    
      u_field    = row_length * u_rows                                     MAKEBC1.492    
      u_field_intfa = u_field                                              UDR3F405.187    
      write (6,*) ' u_field_intfa set to ',u_field_intfa                   UDR3F405.188    
                                                                           MAKEBC1.493    
!     Get model levels for this dump                                       MAKEBC1.494    
      p_levels   = inthd(8)                                                MAKEBC1.495    
      q_levels   = inthd(9)                                                MAKEBC1.496    
      tr_levels  = inthd(12)                                               MAKEBC1.497    
                                                                           MAKEBC1.498    
      write (6,*) ' '                                                      MAKEBC1.499    
      write (6,*) ' Model Grid/Levels in this dump. '                      MAKEBC1.500    
      write (6,*) ' row_length = ',row_length                              MAKEBC1.501    
      write (6,*) ' p_rows     = ',p_rows                                  MAKEBC1.502    
      write (6,*) ' u_rows     = ',u_rows                                  MAKEBC1.503    
      write (6,*) ' p_levels   = ',p_levels                                MAKEBC1.504    
      write (6,*) ' q_levels   = ',q_levels                                MAKEBC1.505    
      write (6,*) ' tr_levels  = ',tr_levels                               MAKEBC1.506    
      write (6,*) ' p_field    = ',p_field                                 MAKEBC1.507    
      write (6,*) ' u_field    = ',u_field                                 MAKEBC1.508    
                                                                           MAKEBC1.509    
!     Ensure TR_LEVELS > 0 to prevent zero dynamic allocation.             MAKEBC1.510    
      if (tr_levels.le.0) then                                             MAKEBC1.511    
        tr_levels = 1                                                      MAKEBC1.512    
      endif                                                                MAKEBC1.513    
                                                                           MAKEBC1.514    
!     Proceed to read model data from dump and get boundary conditions     MAKEBC1.515    
      call get_bc (jdump,unit_no,unit_no_bc,um_versn,                      MAKEBC1.516    
     &  Fixhd_intfa,Inthd_intfa,Lookup_intfa,                              UDR3F405.189    
     &  Realhd_intfa,Levdepc_intfa,                                        UDR3F405.190    
     &  Intf_akh,Intf_bkh,Intf_ak,Intf_bk,                                 UDR3F405.191    
*CALL ARGSIZE                                                              MAKEBC1.517    
*CALL ARGPPX                                                               MAKEBC1.518    
     +          icode,cmessage)                                            MAKEBC1.519    
                                                                           MAKEBC1.520    
      if (icode.gt.0) then                                                 MAKEBC1.521    
        write (6,*) ' Error in subroutine GET_BC'                          UDR3F405.192    
        write (6,*) ' icode = ',icode                                      MAKEBC1.523    
        go to 9999  !  Return                                              MAKEBC1.524    
      endif                                                                MAKEBC1.525    
                                                                           MAKEBC1.526    
!     Close the dump                                                       MAKEBC1.527    
      call file_close (unit_no,env,len_env,env_var,0,icode)                MAKEBC1.528    
      if (icode.ne.0) then                                                 MAKEBC1.529    
        write (6,*) 'Error in closing dump on unit no ',unit_no            MAKEBC1.530    
        go to 9999  !  Return                                              MAKEBC1.531    
      endif                                                                MAKEBC1.532    
                                                                           MAKEBC1.533    
      enddo   !    End of loop over dumps                                  MAKEBC1.534    
                                                                           MAKEBC1.535    
!     Close Boundary Dataset                                               MAKEBC1.536    
      call file_close (unit_no_bc,'BCFILE',len_env,env_var,0,icode)        MAKEBC1.537    
      if (icode.ne.0) then                                                 MAKEBC1.538    
        write (6,*) 'Error in closing Boundary Dataset on unit no ',       MAKEBC1.539    
     &  unit_no_bc                                                         MAKEBC1.540    
        go to 9999  !  Return                                              MAKEBC1.541    
      endif                                                                MAKEBC1.542    
                                                                           MAKEBC1.543    
 9999 continue                                                             MAKEBC1.544    
                                                                           MAKEBC1.545    
      return                                                               MAKEBC1.546    
      end                                                                  MAKEBC1.547    
                                                                           MAKEBC1.548    
!+ Subroutine GET_BC : Get boundary conditions from model dump             MAKEBC1.549    
!                                                                          MAKEBC1.550    
! Subroutine Interface :                                                   MAKEBC1.551    

      subroutine get_bc (jdump,unit_no,unit_no_bc,um_versn,                 1,6MAKEBC1.552    
     &  Fixhd_intfa,Inthd_intfa,Lookup_intfa,                              UDR3F405.193    
     &  Realhd_intfa,Levdepc_intfa,                                        UDR3F405.194    
     &  Intf_akh,Intf_bkh,Intf_ak,Intf_bk,                                 UDR3F405.195    
*CALL ARGSIZE                                                              MAKEBC1.553    
*CALL ARGPPX                                                               MAKEBC1.554    
     +                icode,cmessage)                                      MAKEBC1.555    
                                                                           MAKEBC1.556    
      IMPLICIT NONE                                                        MAKEBC1.557    
!                                                                          MAKEBC1.558    
! Description : Get boundary conditions from model dump                    MAKEBC1.559    
!                                                                          MAKEBC1.560    
! Method : For each dump, read in data through UM_READDUMP and             MAKEBC1.561    
!          generate boundary conditions through GEN_INTF. Also             MAKEBC1.562    
!          calls IN_INTF to initialise boundary dataset.                   MAKEBC1.563    
!                                                                          MAKEBC1.564    
! Current Code Owner : Dave Robinson, NWP                                  MAKEBC1.565    
!                                                                          MAKEBC1.566    
! History :                                                                MAKEBC1.567    
! Version    Date    Comment                                               MAKEBC1.568    
! -------    ----    -------                                               MAKEBC1.569    
!   4.4    10/10/97  Original Code                                         MAKEBC1.570    
!                                                                          MAKEBC1.571    
! Code Description :                                                       MAKEBC1.572    
! Language : FORTRAN 77 + common extensions                                MAKEBC1.573    
! This code is written to UMDP3 v6 programming standards.                  MAKEBC1.574    
!                                                                          MAKEBC1.575    
! Declarations :                                                           MAKEBC1.576    
!                                                                          MAKEBC1.577    
! Global Variables :                                                       MAKEBC1.578    
!                                                                          MAKEBC1.579    
*CALL CSUBMODL                                                             MAKEBC1.580    
*CALL CMAXSIZE                                                             MAKEBC1.581    
*CALL CINTFA                                                               UDR3F405.196    
*CALL TYPSIZE                                                              MAKEBC1.582    
*CALL TYPD1                                                                MAKEBC1.583    
*CALL TYPDUMA                                                              MAKEBC1.584    
*CALL TYPINFA                                                              MAKEBC1.585    
*CALL TYPSTS                                                               MAKEBC1.586    
*CALL TYPPTRA                                                              MAKEBC1.587    
*CALL TYPCONA                                                              MAKEBC1.588    
*CALL CHSUNITS                                                             MAKEBC1.589    
*CALL CCONTROL                                                             MAKEBC1.590    
*CALL PPXLOOK                                                              MAKEBC1.591    
                                                                           MAKEBC1.592    
! Subroutine arguments                                                     MAKEBC1.593    
!   Scalar arguments with intent(in) :                                     MAKEBC1.594    
                                                                           MAKEBC1.595    
      Integer jdump            !  No of dump being processed.              MAKEBC1.596    
      Integer unit_no          !  Unit No for input dump                   MAKEBC1.597    
      Integer unit_no_bc       !  Unit No for boundary dataset             MAKEBC1.598    
      Integer um_versn         !  UM Version Boundary Dataset for          MAKEBC1.599    
                                                                           MAKEBC1.600    
!   Array arguments with intent(in) :                                      MAKEBC1.601    
                                                                           MAKEBC1.602    
!   Scalar arguments with intent(inout) :                                  MAKEBC1.603    
                                                                           MAKEBC1.604    
!   Array arguments with intent(inout) :                                   MAKEBC1.605    
                                                                           MAKEBC1.606    
!   Scalar arguments with intent(out) :                                    MAKEBC1.607    
                                                                           MAKEBC1.608    
      Integer icode            !  Error code                               MAKEBC1.609    
      Character*80 cmessage    !  Error Message                            MAKEBC1.610    
                                                                           MAKEBC1.611    
!   Array arguments with intent(out) :                                     MAKEBC1.612    
                                                                           MAKEBC1.613    
!   Local parameters :                                                     MAKEBC1.614    
                                                                           MAKEBC1.615    
!   Local scalars :                                                        MAKEBC1.616    
                                                                           MAKEBC1.617    
      Integer submodel_id      !  Sub model identifier                     MAKEBC1.618    
      Integer internal_model   !  Internal model identifier                MAKEBC1.619    
                                                                           MAKEBC1.620    
      Logical readhdr          !  T : Read headers from dump               MAKEBC1.621    
                                                                           MAKEBC1.622    
!   Function & Subroutine calls                                            MAKEBC1.623    
                                                                           MAKEBC1.624    
      EXTERNAL gen_intf,in_intf,intf_hintc,setpos,set_ppindex,             MAKEBC1.625    
     &         um_readdump                                                 MAKEBC1.626    
                                                                           MAKEBC1.627    
!-  End of Header                                                          MAKEBC1.628    
                                                                           MAKEBC1.629    
      submodel_id    = 1                                                   MAKEBC1.630    
      internal_model = 1                                                   MAKEBC1.631    
                                                                           MAKEBC1.632    
!     Go to start of dump                                                  MAKEBC1.633    
      call setpos (unit_no,0,icode)                                        MAKEBC1.634    
      if (icode.gt.0) then                                                 MAKEBC1.635    
        write (6,*) 'Error in SETPOS for Model Dump.'                      MAKEBC1.636    
        go to 9999   !  Return                                             MAKEBC1.637    
      endif                                                                MAKEBC1.638    
                                                                           MAKEBC1.639    
!     Headers required from dump                                           MAKEBC1.640    
      readhdr = .true.                                                     MAKEBC1.641    
                                                                           MAKEBC1.642    
!     Read in headers & data from dump                                     MAKEBC1.643    
      call um_readdump (unit_no,a_fixhd,len_fixhd,                         MAKEBC1.644    
     +     a_inthd,a_len_inthd,                                            MAKEBC1.645    
     +     a_realhd,a_len_realhd,                                          MAKEBC1.646    
     +     a_levdepc,a_len1_levdepc,a_len2_levdepc,                        MAKEBC1.647    
     +     a_rowdepc,a_len1_rowdepc,a_len2_rowdepc,                        MAKEBC1.648    
     +     a_coldepc,a_len1_coldepc,a_len2_coldepc,                        MAKEBC1.649    
     +     a_flddepc,a_len1_flddepc,a_len2_flddepc,                        MAKEBC1.650    
     +     a_extcnst,a_len_extcnst,                                        MAKEBC1.651    
     +     a_dumphist,len_dumphist,                                        MAKEBC1.652    
     +     a_cfi1,a_len_cfi1,a_cfi2,a_len_cfi2,a_cfi3,a_len_cfi3,          MAKEBC1.653    
     +     a_lookup,len1_lookup,a_len2_lookup,                             MAKEBC1.654    
     +     submodel_id,no_obj_d1,d1_addr,                                  MAKEBC1.655    
     +     a_len_data,d1,                                                  MAKEBC1.656    
*CALL ARGPPX                                                               MAKEBC1.657    
     +     readhdr,icode,cmessage)                                         MAKEBC1.658    
                                                                           MAKEBC1.659    
      if (icode.gt.0) then                                                 MAKEBC1.660    
        write (6,*) 'Error in UM_READDUMP for Model Dump.'                 MAKEBC1.661    
        go to 9999   !  Return                                             MAKEBC1.662    
      endif                                                                MAKEBC1.663    
                                                                           MAKEBC1.664    
!     Set up the Headers in the boundary dataset.                          MAKEBC1.665    
!     Only done for first model dump                                       MAKEBC1.666    
      if (jdump.eq.1) then                                                 MAKEBC1.667    
                                                                           MAKEBC1.668    
        write (6,*) ' '                                                    MAKEBC1.669    
        write (6,*) ' Dump No ',jdump,' : Calling IN_INTF.'                MAKEBC1.670    
        write (6,*) ' IN_INTF calls INTF_HINTC for Dump No 1.'             MAKEBC1.671    
                                                                           MAKEBC1.672    
        call in_intf (                                                     MAKEBC1.673    
*CALL ARGSIZE                                                              MAKEBC1.674    
*CALL ARGD1                                                                MAKEBC1.675    
*CALL ARGDUMA                                                              MAKEBC1.676    
*CALL ARGINFA                                                              MAKEBC1.677    
     +                unit_no_bc,icode,cmessage)                           MAKEBC1.678    
                                                                           MAKEBC1.679    
        if (icode.gt.0) then                                               MAKEBC1.680    
          write (6,*) 'Error in IN_INTF.'                                  MAKEBC1.681    
          go to 9999   !  Return                                           MAKEBC1.682    
        endif                                                              MAKEBC1.683    
                                                                           MAKEBC1.684    
!       Set UM Version for Boundary dataset                                MAKEBC1.685    
        fixhd_intfa(12,1) = um_versn                                       MAKEBC1.686    
                                                                           MAKEBC1.687    
       endif                                                               MAKEBC1.688    
                                                                           MAKEBC1.689    
!     Calculate interpolation coeffcients between model and boundary       MAKEBC1.690    
!     data. INTF_HINTC is called within IN_INTF for first dump.            MAKEBC1.691    
      if (jdump.ge.2) then                                                 MAKEBC1.692    
                                                                           MAKEBC1.693    
        write (6,*) ' '                                                    MAKEBC1.694    
        write (6,*) ' Dump No ',jdump,' : calling INTF_HINTC.'             MAKEBC1.695    
                                                                           MAKEBC1.696    
        call intf_hintc (                                                  MAKEBC1.697    
     +       p_rows, u_rows, row_length, u_field,                          MAKEBC1.698    
*CALL ARGSIZE                                                              MAKEBC1.699    
*CALL ARGDUMA                                                              MAKEBC1.700    
*CALL ARGINFA                                                              MAKEBC1.701    
     +       1,len_intfa_p(1),len_intfa_u(1),                              MAKEBC1.702    
     +       icode,cmessage,LLBOUTim(1))                                   MAKEBC1.703    
                                                                           MAKEBC1.704    
        if (icode.gt.0) then                                               MAKEBC1.705    
          write (6,*) 'Error in INTF_HINTC.'                               MAKEBC1.706    
          go to 9999   !  Return                                           MAKEBC1.707    
        endif                                                              MAKEBC1.708    
                                                                           MAKEBC1.709    
      endif                                                                MAKEBC1.710    
                                                                           MAKEBC1.711    
!     Pointers to AK and BK data for model dump                            MAKEBC1.712    
      jak       = 1                                                        MAKEBC1.713    
      jbk       = jak+p_levels                                             MAKEBC1.714    
                                                                           MAKEBC1.715    
!     Determine pointers and ppindex for data in model dump                MAKEBC1.716    
      call set_ppindex (jpstar,ju,jv,jtheta,jq,jqcf,jtracer,               MAKEBC1.717    
     &     nitems,ppindex,len1_lookup,a_len2_lookup,a_lookup,              MAKEBC1.718    
     &     l_lspice,icode,cmessage)                                        MAKEBC1.719    
                                                                           MAKEBC1.720    
      if (icode.gt.0) then                                                 MAKEBC1.721    
        write (6,*) ' Error in SET_PPINDEX.'                               MAKEBC1.722    
        go to 9999   !  Return                                             MAKEBC1.723    
      endif                                                                MAKEBC1.724    
                                                                           MAKEBC1.725    
      write (6,*) ' '                                                      MAKEBC1.726    
      write (6,*) ' pointers from set_ppindex'                             MAKEBC1.727    
      write (6,*) ' jpstar  = ',jpstar                                     MAKEBC1.728    
      write (6,*) ' ju      = ',ju(1)                                      MAKEBC1.729    
      write (6,*) ' jv      = ',jv(1)                                      MAKEBC1.730    
      write (6,*) ' jtheta  = ',jtheta(1)                                  MAKEBC1.731    
      write (6,*) ' jq      = ',jq(1)                                      MAKEBC1.732    
      write (6,*) ' jqcf    = ',jqcf(1)                                    MAKEBC1.733    
      write (6,*) ' jtracer = ',jtracer(1,1)                               MAKEBC1.734    
                                                                           MAKEBC1.735    
      write (6,*) ' '                                                      MAKEBC1.736    
      write (6,*) ' ppindex from set_ppindex'                              MAKEBC1.737    
      write (6,*) ' ppindex(1)  = ',ppindex(1,1)                           MAKEBC1.738    
      write (6,*) ' ppindex(2)  = ',ppindex(2,1)                           MAKEBC1.739    
      write (6,*) ' ppindex(3)  = ',ppindex(3,1)                           MAKEBC1.740    
      write (6,*) ' ppindex(5)  = ',ppindex(5,1)                           MAKEBC1.741    
      write (6,*) ' ppindex(11) = ',ppindex(11,1)                          MAKEBC1.742    
      write (6,*) ' ppindex(12) = ',ppindex(12,1)                          MAKEBC1.743    
                                                                           MAKEBC1.744    
      write (6,*) ' '                                                      MAKEBC1.745    
      write (6,*) ' Dump No ',jdump,' : Calling GEN_INTF.'                 MAKEBC1.746    
                                                                           MAKEBC1.747    
!     Call GEN_INTF to generate boundary conditions for this dump          MAKEBC1.748    
      call gen_intf (                                                      MAKEBC1.749    
*CALL ARGSIZE                                                              MAKEBC1.750    
*CALL ARGD1                                                                MAKEBC1.751    
*CALL ARGDUMA                                                              MAKEBC1.752    
*CALL ARGSTS                                                               MAKEBC1.753    
*CALL ARGPTRA                                                              MAKEBC1.754    
*CALL ARGCONA                                                              MAKEBC1.755    
*CALL ARGINFA                                                              MAKEBC1.756    
*CALL ARGPPX                                                               MAKEBC1.757    
     +              internal_model,icode,cmessage)                         MAKEBC1.758    
                                                                           MAKEBC1.759    
      if (icode.gt.0) then                                                 MAKEBC1.760    
        write (6,*) 'Error in GEN_INTF.'                                   MAKEBC1.761    
        go to 9999   !  Return                                             MAKEBC1.762    
      endif                                                                MAKEBC1.763    
                                                                           MAKEBC1.764    
 9999 continue                                                             MAKEBC1.765    
                                                                           MAKEBC1.766    
      return                                                               MAKEBC1.767    
      end                                                                  MAKEBC1.768    
*ENDIF                                                                     MAKEBC1.769