*IF DEF,C80_1A,OR,DEF,RECON                                                SDFADR1A.2      
C ******************************COPYRIGHT******************************    SDFADR1A.3      
C (c) CROWN COPYRIGHT 1997, METEOROLOGICAL OFFICE, All Rights Reserved.    SDFADR1A.4      
C                                                                          SDFADR1A.5      
C Use, duplication or disclosure of this code is subject to the            SDFADR1A.6      
C restrictions as set forth in the contract.                               SDFADR1A.7      
C                                                                          SDFADR1A.8      
C                Meteorological Office                                     SDFADR1A.9      
C                London Road                                               SDFADR1A.10     
C                BRACKNELL                                                 SDFADR1A.11     
C                Berkshire UK                                              SDFADR1A.12     
C                RG12 2SZ                                                  SDFADR1A.13     
C                                                                          SDFADR1A.14     
C If no contract has been raised with this copy of the code, the use,      SDFADR1A.15     
C duplication or disclosure of it is strictly prohibited.  Permission      SDFADR1A.16     
C to do so must first be obtained in writing from the Head of Numerical    SDFADR1A.17     
C Modelling at the above address.                                          SDFADR1A.18     
C ******************************COPYRIGHT******************************    SDFADR1A.19     
C                                                                          SDFADR1A.20     
CLL  Routine: SDFADR1A ------------------------------------------------    SDFADR1A.21     
CLL                                                                        SDFADR1A.22     
CLL  Purpose: To set the LBEGIN and LBNREC fields in the LOOKUP Headers    SDFADR1A.23     
CLL           for VN 16 Type Dumpfiles - addressed by location and         SDFADR1A.24     
CLL           length which are rounded up the 'UM_SECTOR_SIZE' to make     SDFADR1A.25     
CLL           Well-Formed I/O Requests.                                    SDFADR1A.26     
CLL                                                                        SDFADR1A.27     
CLL  Author:  Bob Carruthers, Cray Research.   Date: 20 May 1997           SDFADR1A.28     
CLL                                                                        SDFADR1A.29     
CLL  Modifications                                                         GCJ2F405.65     
CLL  V4.5     Check that there are data in file. C.P. Jones 12 Feb 1998    GCJ2F405.66     
CLL                                                                        GCJ2F405.67     
CLL  -------------------------------------------------------------------   SDFADR1A.30     
C*L  Interface and arguments: ------------------------------------------   SDFADR1A.31     

      subroutine set_dumpfile_address(fixhd, len_fixhd,                     21,1SDFADR1A.32     
     &                                lookup, len1_lookup, len2_lookup,    SDFADR1A.33     
     &                                number_of_data_words_in_memory,      SDFADR1A.34     
     &                                number_of_data_words_on_disk,        SDFADR1A.35     
     &                                disk_address)                        SDFADR1A.36     
c                                                                          SDFADR1A.37     
      implicit none                                                        SDFADR1A.38     
                                                                           SDFADR1A.39     
      integer                                                              SDFADR1A.40     
     & len_fixhd                       ! IN  Length of fixed length        SDFADR1A.41     
                                       !     header                        SDFADR1A.42     
     &,len1_lookup                     ! IN  1st dim of lookup             SDFADR1A.43     
     &,len2_lookup                     ! IN  2nd dim of lookup             SDFADR1A.44     
     &,number_of_data_words_in_memory  ! OUT Number of Data Words          SDFADR1A.45     
                                       !     in memory                     SDFADR1A.46     
     &,number_of_data_words_on_disk    ! OUT Number of data words          SDFADR1A.47     
                                       !     on disk                       SDFADR1A.48     
     &,disk_address                    ! OUT Current rounded disk          SDFADR1A.49     
                                       !     address and final data        SDFADR1A.50     
                                       !     length                        SDFADR1A.51     
                                                                           SDFADR1A.52     
      integer                                                              SDFADR1A.53     
     & fixhd(len_fixhd)                !IN Fixed length header             SDFADR1A.54     
     &,lookup(len1_lookup,len2_lookup) !IN/OUT PP lookup tables            SDFADR1A.55     
                                                                           SDFADR1A.56     
*CALL CLOOKADD                                                             SDFADR1A.57     
*CALL CNTL_IO                                                              SDFADR1A.58     
*CALL PARVARS                                                              SDFADR1A.59     
                                                                           SDFADR1A.60     
      integer                                                              SDFADR1A.61     
     & disk_length                     ! current data length on disk       SDFADR1A.62     
     &,i                               ! Loop Index                        SDFADR1A.63     
     &,old_fixhd_160                   ! Original value of fixhd(160)      SDFADR1A.64     
                                       ! checking as the new addresses     SDFADR1A.65     
                                       ! are computed                      SDFADR1A.66     
                                                                           SDFADR1A.67     
c                                                                          SDFADR1A.68     
      if(fixhd(160).lt.0) RETURN                                           GCJ2F405.68     
                                                                           GCJ2F405.69     
c--check that the initial data address has been rounded up                 SDFADR1A.69     
c  to a sector boundary - REMEMBER all the code removes                    SDFADR1A.70     
c  one from this address because addresses start at zero.                  SDFADR1A.71     
      if((fixhd(160)-1) .ne.                                               SDFADR1A.72     
     2 (((fixhd(160)-1)+um_sector_size-1)/um_sector_size)*                 SDFADR1A.73     
     3 um_sector_size) then                                                SDFADR1A.74     
c--save the current initial data address                                   SDFADR1A.75     
        old_fixhd_160=fixhd(160)                                           SDFADR1A.76     
c--round up the initial disk address                                       SDFADR1A.77     
        fixhd(160)=(((fixhd(160)-1)+um_sector_size-1)/                     SDFADR1A.78     
     2   um_sector_size)*um_sector_size+1                                  SDFADR1A.79     
*IF DEF,DIAG92                                                             SDFADR1A.80     
*IF DEF,MPP                                                                SDFADR1A.81     
        if(mype.eq.0) then                                                 SDFADR1A.82     
*ENDIF                                                                     SDFADR1A.83     
          write(6,900) old_fixhd_160-1, fixhd(160)-1                       SDFADR1A.84     
900       format(/'SET_DUMPFILE_ADDRESS: Start of Data Address',           SDFADR1A.85     
     2     ' on Disk reset from ',i10,' to ',i10)                          SDFADR1A.86     
*IF DEF,T3E                                                                SDFADR1A.87     
          write(0,900) old_fixhd_160-1, fixhd(160)-1                       SDFADR1A.88     
*ENDIF                                                                     SDFADR1A.89     
*IF DEF,MPP                                                                SDFADR1A.90     
        endif                                                              SDFADR1A.91     
*ENDIF                                                                     SDFADR1A.92     
*ENDIF                                                                     SDFADR1A.93     
      endif                                                                SDFADR1A.94     
c                                                                          SDFADR1A.95     
c--adjust the Dumpfile version Number                                      SDFADR1A.96     
c      if(fixhd(1).lt.16) fixhd(1)=16                                      SDFADR1A.97     
c                                                                          SDFADR1A.98     
c--count the number of words on disk and in memory                         SDFADR1A.99     
      number_of_data_words_on_disk=0                                       SDFADR1A.100    
      number_of_data_words_in_memory=0                                     SDFADR1A.101    
c                                                                          SDFADR1A.102    
c--find the initial data location on disk                                  SDFADR1A.103    
      disk_address=fixhd(160)-1                                            SDFADR1A.104    
c                                                                          SDFADR1A.105    
c--loop over all the entries and alter the addresses and lengths           SDFADR1A.106    
      do i=1, len2_lookup                                                  SDFADR1A.107    
c--check for a PP type file with an incomplete lookup table                SDFADR1A.108    
        if(lookup(1, i).eq.-99) goto 200                                   SDFADR1A.109    
c--check for packing to 32-bits                                            SDFADR1A.110    
        if(lookup(lbpack,i)-                                               SDFADR1A.111    
     2   ((lookup(lbpack,i)/10)*10).eq.2) then                             SDFADR1A.112    
          disk_length=(lookup(lblrec,i)+1)/2                               SDFADR1A.113    
        else                                                               SDFADR1A.114    
          disk_length=lookup(lblrec,i)                                     SDFADR1A.115    
        endif                                                              SDFADR1A.116    
c--count the number of words                                               SDFADR1A.117    
        number_of_data_words_on_disk=                                      SDFADR1A.118    
     2   number_of_data_words_on_disk+disk_length                          SDFADR1A.119    
        number_of_data_words_in_memory=                                    SDFADR1A.120    
     2   number_of_data_words_in_memory+lookup(lblrec,i)                   SDFADR1A.121    
c--round up the length to a number of sectors                              SDFADR1A.122    
        disk_length=((disk_length+um_sector_size-1)/                       SDFADR1A.123    
     2   um_sector_size)*um_sector_size                                    SDFADR1A.124    
c--set the disk address                                                    SDFADR1A.125    
        lookup(lbegin,i)=disk_address                                      SDFADR1A.126    
c--set the disk length                                                     SDFADR1A.127    
        lookup(lbnrec,i)=disk_length                                       SDFADR1A.128    
c--increment the disk address                                              SDFADR1A.129    
        disk_address=disk_address+lookup(lbnrec,i)                         SDFADR1A.130    
      end do                                                               SDFADR1A.131    
c--escape for PP type files                                                SDFADR1A.132    
200   continue                                                             SDFADR1A.133    
c                                                                          SDFADR1A.134    
*IF DEF,DIAG92                                                             SDFADR1A.135    
*IF DEF,MPP                                                                SDFADR1A.136    
      if(mype.eq.0) then                                                   SDFADR1A.137    
*ENDIF                                                                     SDFADR1A.138    
c--find the number of bytes in a word                                      SDFADR1A.139    
        call word_length(i)                                                SDFADR1A.140    
c--print the diagnostic message                                            SDFADR1A.141    
        write(6,1000) fixhd(161), number_of_data_words_in_memory,          SDFADR1A.142    
     2   number_of_data_words_on_disk, disk_address-fixhd(160),            SDFADR1A.143    
     3   disk_address, disk_address*i                                      SDFADR1A.144    
1000    format(/'SET_DUMPFILE_ADDRESS: Dumpfile LOOKUP Address',           SDFADR1A.145    
     2   ' and Lengths Rewritten:'//                                       SDFADR1A.146    
     3   i10,' Words Stored as Data Length in FIXHD(161)'/                 SDFADR1A.147    
     4   i10,' Words Used in Memory for Data'/                             SDFADR1A.148    
     5   i10,' Words Used on Disk for Data'/                               SDFADR1A.149    
     6   i10,' Words Used on Disk for Data after Rounding'/                SDFADR1A.150    
     7   i10,' Words Used on Disk in Total for the File',                  SDFADR1A.151    
     8   '  (',i11,' Bytes)'/)                                             SDFADR1A.152    
*IF DEF,T3E                                                                SDFADR1A.153    
        write(0,1000) fixhd(161), number_of_data_words_in_memory,          SDFADR1A.154    
     2   number_of_data_words_on_disk, disk_address-fixhd(160),            SDFADR1A.155    
     3   disk_address, disk_address*i                                      SDFADR1A.156    
*ENDIF                                                                     SDFADR1A.157    
*IF DEF,MPP                                                                SDFADR1A.158    
      endif                                                                SDFADR1A.159    
*ENDIF                                                                     SDFADR1A.160    
*ENDIF                                                                     SDFADR1A.161    
      return                                                               SDFADR1A.162    
      end                                                                  SDFADR1A.163    
*ENDIF                                                                     SDFADR1A.164