*IF DEF,FLUXPROC                                                           FLXPROC1.2      
C ******************************COPYRIGHT******************************    FLXPROC1.3      
C (c) CROWN COPYRIGHT 1998, METEOROLOGICAL OFFICE, All Rights Reserved.    FLXPROC1.4      
C                                                                          FLXPROC1.5      
C Use, duplication or disclosure of this code is subject to the            FLXPROC1.6      
C restrictions as set forth in the contract.                               FLXPROC1.7      
C                                                                          FLXPROC1.8      
C                Meteorological Office                                     FLXPROC1.9      
C                London Road                                               FLXPROC1.10     
C                BRACKNELL                                                 FLXPROC1.11     
C                Berkshire UK                                              FLXPROC1.12     
C                RG12 2SZ                                                  FLXPROC1.13     
C                                                                          FLXPROC1.14     
C If no contract has been raised with this copy of the code, the use,      FLXPROC1.15     
C duplication or disclosure of it is strictly prohibited.  Permission      FLXPROC1.16     
C to do so must first be obtained in writing from the Head of Numerical    FLXPROC1.17     
C Modelling at the above address.                                          FLXPROC1.18     
C ******************************COPYRIGHT******************************    FLXPROC1.19     
C                                                                          FLXPROC1.20     
C Programming standard: Unified Model Documentation Paper No 3             FLXPROC1.21     
C                       Version No 1 15/1/90                               FLXPROC1.22     
C History:                                                                 FLXPROC1.23     
C version  date         change                                             FLXPROC1.24     
C 4.5      03/09/98     New code                                           FLXPROC1.25     
C                                                                          FLXPROC1.26     
! Author:     M. J. Bell                                                   FLXPROC1.27     
!----------------------------------------------------------------------    FLXPROC1.28     
! contains progam: FOAM_Flux_Process                                       FLXPROC1.29     
!                                                                          FLXPROC1.30     
! Purpose: Flux processing routine.                                        FLXPROC1.31     
!          Takes fields files of fluxes                                    FLXPROC1.32     
!          (a) output from NWP  and                                        FLXPROC1.33     
!          (b) NWP or coupled model or observed "climatologies"            FLXPROC1.34     
!          combines them into fluxes as required by FOAM ocean model       FLXPROC1.35     
!          interpolates them to the FOAM grid and                          FLXPROC1.36     
!          fills in missing data values                                    FLXPROC1.37     
!----------------------------------------------------------------------    FLXPROC1.38     

      Program FOAM_Flux_Process                                            ,10FLXPROC1.39     
                                                                           FLXPROC1.40     
      implicit none                                                        FLXPROC1.41     
                                                                           FLXPROC1.42     
*CALL CSUBMODL                                                             FLXPROC1.43     
                                                                           FLXPROC1.44     
! declaration of parameters                                                FLXPROC1.45     
                                                                           FLXPROC1.46     
! declaration of globals used                                              FLXPROC1.47     
*CALL CMESS                                                                FLXPROC1.48     
                                                                           FLXPROC1.49     
! declaration of local scalars                                             FLXPROC1.50     
                                                                           FLXPROC1.51     
*CALL CFLDDIMS                                                             FLXPROC1.52     
      integer icode  ! error code ; > 0 => fatal error detected            FLXPROC1.53     
      integer ppxRecs                                                      FLXPROC1.54     
      character*80 cmessage                                                FLXPROC1.55     
                                                                           FLXPROC1.56     
! declaration of routines used                                             FLXPROC1.57     
      external open_control_files, read_control_files,                     FLXPROC1.58     
     #   read_field_headers, read_lsm_headers, Process_main,               FLXPROC1.59     
     #   close_files                                                       FLXPROC1.60     
!----------------------------------------------------------------------    FLXPROC1.61     
! 0. Preliminaries                                                         FLXPROC1.62     
      CSub = 'FOAM_Flux_Process'  ! subroutine name for error messages     FLXPROC1.63     
                                                                           FLXPROC1.64     
      icode = 0   ! initialise icode                                       FLXPROC1.65     
                                                                           FLXPROC1.66     
! 0.1 Initialise N_INTERNAL_MODEL/INTERNAL_MODEL_INDEX                     FLXPROC1.67     
      N_INTERNAL_MODEL=4                                                   FLXPROC1.68     
      INTERNAL_MODEL_INDEX(1)=1    !  Atmos                                FLXPROC1.69     
      INTERNAL_MODEL_INDEX(2)=2    !  Ocean                                FLXPROC1.70     
      INTERNAL_MODEL_INDEX(3)=3    !  Slab                                 FLXPROC1.71     
      INTERNAL_MODEL_INDEX(4)=4    !  Wave                                 FLXPROC1.72     
                                                                           FLXPROC1.73     
! 0.2 Read STASHmaster files                                               FLXPROC1.74     
      ppxRecs=1                                                            FLXPROC1.75     
      CALL HDPPXRF(22,'STASHmaster_A',ppxRecs,ICODE,CMESSAGE)              FLXPROC1.76     
      CALL HDPPXRF(22,'STASHmaster_O',ppxRecs,ICODE,CMESSAGE)              FLXPROC1.77     
      CALL HDPPXRF(22,'STASHmaster_S',ppxRecs,ICODE,CMESSAGE)              FLXPROC1.78     
      CALL HDPPXRF(22,'STASHmaster_W',ppxRecs,ICODE,CMESSAGE)              FLXPROC1.79     
                                                                           FLXPROC1.80     
 ! 1. Open all control and log files                                       FLXPROC1.81     
      call open_control_files( icode )                                     FLXPROC1.82     
                                                                           FLXPROC1.83     
      if ( icode .gt. 0 ) then                                             FLXPROC1.84     
        write(UnErr,*)CErr,CSub,                                           FLXPROC1.85     
     # ' step 1. Failed to open control and log files'                     FLXPROC1.86     
        go to 9999                                                         FLXPROC1.87     
      end if                                                               FLXPROC1.88     
                                                                           FLXPROC1.89     
! 2. Read all control files and open output flux files                     FLXPROC1.90     
      call read_control_files( icode )                                     FLXPROC1.91     
                                                                           FLXPROC1.92     
      if ( icode .gt. 0 ) then                                             FLXPROC1.93     
        write(UnErr,*)CErr,CSub,                                           FLXPROC1.94     
     #' step 2. Failed to read control files or open output flux files'    FLXPROC1.95     
        go to 9999                                                         FLXPROC1.96     
      end if                                                               FLXPROC1.97     
                                                                           FLXPROC1.98     
! 3. Open and read headers (fixed header & lookups) of flux fields         FLXPROC1.99     
      call read_field_headers( ppxRecs,icode )                             FLXPROC1.100    
                                                                           FLXPROC1.101    
      if ( icode .gt. 0 ) then                                             FLXPROC1.102    
        write(UnErr,*)CErr,CSub,                                           FLXPROC1.103    
     # ' step 3. Failed to read headers of flux fields'                    FLXPROC1.104    
        go to 9999                                                         FLXPROC1.105    
      end if                                                               FLXPROC1.106    
                                                                           FLXPROC1.107    
! 4. Open and read lookup tables of land-sea masks and find                FLXPROC1.108    
!    field dimensions                                                      FLXPROC1.109    
      call read_lsm_headers(                                               FLXPROC1.110    
*CALL AFLDDIMS                                                             FLXPROC1.111    
     #    ppxRecs,icode)                                                   FLXPROC1.112    
                                                                           FLXPROC1.113    
      if ( icode .gt. 0 ) then                                             FLXPROC1.114    
        write(UnErr,*)CErr,CSub,                                           FLXPROC1.115    
     # ' step 4. Failed to read lookups of lsms'                           FLXPROC1.116    
        go to 9999                                                         FLXPROC1.117    
      end if                                                               FLXPROC1.118    
                                                                           FLXPROC1.119    
! 5. Do main processing at a lower level                                   FLXPROC1.120    
      call Process_main(                                                   FLXPROC1.121    
*CALL AFLDDIMS                                                             FLXPROC1.122    
     #     ppxRecs,icode)                                                  FLXPROC1.123    
                                                                           FLXPROC1.124    
      if ( icode .gt. 0 ) then                                             FLXPROC1.125    
        write(UnErr,*)CErr,CSub,                                           FLXPROC1.126    
     # ' step 5. Failed doing main processing'                             FLXPROC1.127    
        go to 9999                                                         FLXPROC1.128    
      end if                                                               FLXPROC1.129    
                                                                           FLXPROC1.130    
! 6. close files opened in steps 1. - 4.                                   FLXPROC1.131    
                                                                           FLXPROC1.132    
      call close_files                                                     FLXPROC1.133    
                                                                           FLXPROC1.134    
9999  continue                                                             FLXPROC1.135    
      if ( icode .le. 0 ) then                                             FLXPROC1.136    
        stop                                                               FLXPROC1.137    
      else                                                                 FLXPROC1.138    
        write(UnErr,*)CErr,Csub,                                           FLXPROC1.139    
     #   'Flux Processing failed with error code = ',icode                 FLXPROC1.140    
        close ( UnErr )                                                    FLXPROC1.141    
        stop                                                               FLXPROC1.142    
      endif                                                                FLXPROC1.143    
      end                                                                  FLXPROC1.144    
!----------------------------------------------------------------------    FLXPROC1.145    
*ENDIF                                                                     FLXPROC1.146