*IF DEF,CONTROL,AND,DEF,ATMOS                                              VARCTL1.2      
C ******************************COPYRIGHT******************************    GTS2F400.11305  
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved.    GTS2F400.11306  
C                                                                          GTS2F400.11307  
C Use, duplication or disclosure of this code is subject to the            GTS2F400.11308  
C restrictions as set forth in the contract.                               GTS2F400.11309  
C                                                                          GTS2F400.11310  
C                Meteorological Office                                     GTS2F400.11311  
C                London Road                                               GTS2F400.11312  
C                BRACKNELL                                                 GTS2F400.11313  
C                Berkshire UK                                              GTS2F400.11314  
C                RG12 2SZ                                                  GTS2F400.11315  
C                                                                          GTS2F400.11316  
C If no contract has been raised with this copy of the code, the use,      GTS2F400.11317  
C duplication or disclosure of it is strictly prohibited.  Permission      GTS2F400.11318  
C to do so must first be obtained in writing from the Head of Numerical    GTS2F400.11319  
C Modelling at the above address.                                          GTS2F400.11320  
C ******************************COPYRIGHT******************************    GTS2F400.11321  
C                                                                          GTS2F400.11322  
!+ Control for VAR outer loop processing within UM                         VARCTL1.3      
!                                                                          VARCTL1.4      
! Subroutine Interface:                                                    VARCTL1.5      

      SUBROUTINE Var_Ctl(                                                   1,5VARCTL1.6      
*CALL ARGSIZE                                                              VARCTL1.7      
*CALL ARGD1                                                                VARCTL1.8      
*CALL ARGDUMA                                                              VARCTL1.9      
*CALL ARGSTS                                                               VARCTL1.10     
*CALL ARGPTRA                                                              VARCTL1.11     
*CALL ARGCONA                                                              VARCTL1.12     
*CALL ARGPPX                                                               VSB1F400.581    
     &                  ErrorStatus,ErrorMessage)                          VARCTL1.13     
                                                                           VARCTL1.14     
      IMPLICIT NONE                                                        VARCTL1.15     
!                                                                          VARCTL1.16     
! Description:                                                             VARCTL1.17     
! Level 2 control routine                                                  VARCTL1.18     
! Loop over Obs Files calling VAR_UMProcessing                             VARCTL1.19     
! This additional control routine required so that dynamic space sizes     VARCTL1.20     
! can be passed to the lower level control routine and also to provide a   VARCTL1.21     
! *DEF CONTROL reference to the VAR outer loop code                        VARCTL1.22     
!                                                                          VARCTL1.23     
! Method:                                                                  VARCTL1.24     
!   The interface with ATMSTEP has been copied from AC_CTL                 VARCTL1.25     
!                                                                          VARCTL1.26     
! Current Code Owner: Stuart Bell                                          VARCTL1.27     
!                                                                          VARCTL1.28     
! History:                                                                 VARCTL1.29     
! Version   Date     Comment                                               VARCTL1.30     
! -------   ----     -------                                               VARCTL1.31     
! 3.4     1/8/94 Original code.  Stuart Bell                               VARCTL1.32     
! 4.0     6/6/95 Set X/YOffset.  Stuart Bell                               VSB1F400.582    
! 3.5     6/6/95 Sub-Model changes. Include Internal Model                 GDR4F305.402    
!                Identifier/Index. D. Robinson.                            GDR4F305.403    
! 4.1   18/06/96 Changes to cope with changes in STASH addressing          GDG0F401.1572   
!                Author D.M. Goddard.                                      GDG0F401.1573   
!  4.5   24/02/98 Allow Varobs input to be a directory. Stuart Bell        VSB1F405.14     
!                                                                          VARCTL1.33     
! Code Description:                                                        VARCTL1.34     
!   Language: FORTRAN 77 + common extensions                               VARCTL1.35     
                                                                           VARCTL1.36     
! System component covered: P1                                             VARCTL1.37     
! System Task: P0                                                          VARCTL1.38     
                                                                           VARCTL1.39     
! Declarations                                                             VARCTL1.40     
                                                                           VARCTL1.41     
! Global variables (*CALLed COMDECKs etc...):                              VARCTL1.42     
*CALL C_MDI                                                                VARCTL1.43     
*CALL CSUBMODL                                                             GSS1F305.943    
*CALL CMAXSIZE                                                             VARCTL1.44     
*CALL TYPSIZE                                                              VARCTL1.45     
*CALL CTIME                                                                VARCTL1.46     
*CALL C_VARCTL                                                             VARCTL1.47     
                                                                           VARCTL1.48     
! Subroutine arguments                                                     VARCTL1.49     
!   Scalar arguments with intent(in):                                      VARCTL1.50     
!  & Array  arguments with intent(in):                                     VARCTL1.51     
*CALL TYPD1                                                                VARCTL1.52     
*CALL TYPDUMA                                                              VARCTL1.53     
*CALL TYPSTS                                                               VARCTL1.54     
*CALL TYPPTRA                                                              VARCTL1.55     
*CALL TYPCONA                                                              VARCTL1.56     
*CALL PPXLOOK                                                              VSB1F400.583    
                                                                           VARCTL1.57     
!   ErrorStatus <Delete if ErrorStatus not used>                           VARCTL1.58     
      INTEGER       ErrorStatus               !Error flag (0 = OK)         VARCTL1.59     
      CHARACTER*256 ErrorMessage              !Error Message               VARCTL1.60     
                                                                           VARCTL1.61     
! Local parameters:                                                        VARCTL1.62     
                                                                           VARCTL1.63     
! Local scalars:                                                           VARCTL1.64     
      INTEGER Jfile,J                      !loop counter                   VARCTL1.65     
      INTEGER JRH1P5M,JT1P5M,JU10M,JV10M   !Start Addresses in D1          VARCTL1.66     
      INTEGER im_ident          ! Internal Model Identifier                GDR4F305.404    
      INTEGER im_index          ! Internal Model Index                     GDR4F305.405    
!  define variables for OBS headers (would use DUM_LEN but                 VARCTL1.67     
!  LEN_FIXHD & LEN_DUMPHIST defined in COMDECK TYPSIZE)                    VARCTL1.68     
      INTEGER LEN_INTHD, LEN_REALHD                                        VARCTL1.69     
      INTEGER LEN1_LEVDEPC, LEN2_LEVDEPC                                   VARCTL1.70     
      INTEGER LEN1_ROWDEPC, LEN2_ROWDEPC                                   VARCTL1.71     
      INTEGER LEN1_COLDEPC, LEN2_COLDEPC                                   VARCTL1.72     
      INTEGER LEN1_FLDDEPC, LEN2_FLDDEPC                                   VARCTL1.73     
      INTEGER LEN_EXTCNST                                                  VARCTL1.74     
      INTEGER LEN_CFI1, LEN_CFI2, LEN_CFI3                                 VARCTL1.75     
      INTEGER LEN1_LOOKUP_OBS, LEN2_LOOKUP_OBS                             VARCTL1.76     
      INTEGER LEN_DATA          ! Length of data section of obs file       VARCTL1.77     
     &,ICODE                    !Return code from setpos                   GTD0F400.139    
                                                                           VARCTL1.78     
! Local dynamic arrays:                                                    VARCTL1.79     
      INTEGER FIXHD(LEN_FIXHD)  ! Obs file fixed length header             VARCTL1.80     
                                                                           VARCTL1.81     
! Function & Subroutine calls:                                             VARCTL1.82     
      External Var_UMProcessing, SETPOS, READ_FLH, GET_DIM                 VARCTL1.83     
      External HORIZ_GRID_OFFSET                                           VSB1F400.584    
                                                                           VARCTL1.84     
!- End of header                                                           VARCTL1.85     
                                                                           VARCTL1.86     
      im_ident = atmos_im                                                  GDR4F305.406    
      im_index = internal_model_index(im_ident)                            GDR4F305.407    
                                                                           GDR4F305.408    
!-----------------------------------------------------------------------   VARCTL1.87     
        DO J=1,NumModelVars                                                VSB1F400.585    
                                                                           VSB1F400.586    
!  Get X/Y Offsets for this field to identify the grid                     VSB1F400.587    
!  (searching the fields tagged in the dump)                               VSB1F400.588    
          CALL HORIZ_GRID_OFFSET(ItemOut(J),0,im_ident,                    VSB1F400.589    
     &                           XOffset(J),YOffset(J),                    VSB1F400.590    
*CALL ARGSTS                                                               VSB1F400.591    
*CALL ARGPPX                                                               VSB1F400.592    
     &                           ErrorStatus)                              VSB1F400.593    
                                                                           VSB1F400.594    
          IF (ErrorStatus .GT. 0) THEN                                     VSB1F400.595    
           ErrorMessage = "VarCtl: Problem in HORIZ_GRID_OFFSET"           VSB1F400.596    
           GOTO 999                                                        VSB1F400.597    
          END IF                                                           VSB1F400.598    
                                                                           VSB1F400.599    
        END DO  !J                                                         VSB1F400.600    
                                                                           VSB1F400.601    
!-----------------------------------------------------------------------   VSB1F400.602    
!  Loop over observation files                                             VARCTL1.88     
      DO Jfile = 1, NumUsedFiles                                           VSB1F405.15     
                                                                           VARCTL1.90     
!-----------------------------------------------------------------------   VARCTL1.91     
!     Portable I/O open for 'dump type' VAROBS file                        VSB1F405.16     
      CALL FILE_OPEN (ObsUnitNum,                                          VSB1F405.17     
     &                  NameUsedFile(Jfile),LenUsedFile(Jfile),            VSB1F405.18     
     &                  0,1,ErrorStatus)                                   VSB1F405.19     
        IF (ErrorStatus.GT.0) GO TO 999                                    VSB1F405.20     
                                                                           VARCTL1.94     
!-----------------------------------------------------------------------   VARCTL1.95     
!  Read in fixed length header                                             VARCTL1.96     
      CALL READ_FLH (ObsUnitNum,FIXHD,LEN_FIXHD,                           VSB1F405.21     
     &               ErrorStatus,ErrorMessage)                             VARCTL1.98     
        IF (ErrorStatus.GT.0) GO TO 999                                    VARCTL1.99     
                                                                           VARCTL1.100    
!-----------------------------------------------------------------------   VARCTL1.101    
!  Get dimensions of all data set components from FLH                      VARCTL1.102    
      CALL GET_DIM (FIXHD,                                                 VARCTL1.103    
*CALL DUMP_AR2                                                             VARCTL1.104    
     &              LEN_DATA)                                              VARCTL1.105    
                                                                           VARCTL1.106    
!-----------------------------------------------------------------------   VARCTL1.107    
! Set the D1 pointers which are not already in TYPPTRA                     VARCTL1.108    
        JU10M   = IMDI                                                     VARCTL1.109    
        JV10M   = IMDI                                                     VARCTL1.110    
        JT1P5M  = IMDI                                                     VARCTL1.111    
        JRH1P5M = IMDI                                                     VARCTL1.112    
                                                                           VARCTL1.113    
        DO J=1,NumModelVars                                                VARCTL1.114    
         IF(SectionIN(J).EQ.3.AND.ItemIn(J).EQ.225)                        VARCTL1.115    
     &      JU10M=SI(ItemOut(J),0,im_index)                                GDR4F305.409    
         IF(SectionIN(J).EQ.3.AND.ItemIn(J).EQ.226)                        VARCTL1.117    
     &      JV10M=SI(ItemOut(J),0,im_index)                                GDR4F305.410    
         IF(SectionIN(J).EQ.3.AND.ItemIn(J).EQ.236)                        VARCTL1.119    
     &      JT1P5M=SI(ItemOut(J),0,im_index)                               GDR4F305.411    
         IF(SectionIN(J).EQ.3.AND.ItemIn(J).EQ.245)                        VARCTL1.121    
     &      JRH1P5M=SI(ItemOut(J),0,im_index)                              GDR4F305.412    
        END DO                                                             VARCTL1.123    
                                                                           VARCTL1.124    
        IF(JU10M.EQ.IMDI)  ErrorStatus=1                                   VARCTL1.125    
        IF(JV10M.EQ.IMDI)  ErrorStatus=1                                   VARCTL1.126    
        IF(JT1P5M.EQ.IMDI) ErrorStatus=1                                   VARCTL1.127    
        IF(JRH1P5M.EQ.IMDI)ErrorStatus=1                                   VARCTL1.128    
                                                                           VARCTL1.129    
        IF (ErrorStatus.EQ.1)THEN                                          VARCTL1.130    
         ErrorMessage = ' Var_Ctl: Fields missing'                         VARCTL1.131    
         GO TO 999                                                         VARCTL1.132    
        END IF                                                             VARCTL1.133    
!-----------------------------------------------------------------------   VARCTL1.134    
! Call Var processing (section 18 code)                                    VARCTL1.135    
      CALL Var_UMProcessing(Jfile,                                         VARCTL1.136    
*CALL DUMP_AR2                                                             VARCTL1.137    
     &  LEN_DATA,                                                          VARCTL1.138    
     &  A_REALHD(1),                                                       VARCTL1.139    
     &  P_LEVELS, Q_LEVELS, ROW_LENGTH,                                    VARCTL1.140    
     &  P_ROWS, U_ROWS, P_FIELD, U_FIELD,                                  VARCTL1.141    
     &  A_LEVDEPC(JAK), A_LEVDEPC(JBK), AKH, BKH,                          VARCTL1.142    
     &  D1(JOROG), D1(JP_EXNER(1)), D1(JPSTAR),                            VARCTL1.143    
     &  D1(JTHETA(1)), D1(JQ(1)), D1(JU(1)), D1(JV(1)),                    VARCTL1.144    
     &  D1(JQCF(1)), D1(JQCL(1)),                                          VARCTL1.145    
     &  D1(JU10M), D1(JV10M), D1(JT1P5M), D1(JRH1P5M),                     VARCTL1.146    
*CALL ARGPPX                                                               GDG0F401.1574   
     &  ErrorStatus,ErrorMessage)                                          VARCTL1.147    
        IF (ErrorStatus.GT.0) GO TO 999                                    VARCTL1.148    
                                                                           VARCTL1.149    
!-----------------------------------------------------------------------   VSB1F405.22     
!     Portable I/O close for 'dump type' VAROBS file                       VSB1F405.23     
      CALL FILE_CLOSE (ObsUnitNum,                                         VSB1F405.24     
     &                 NameUsedFile(Jfile),LenUsedFile(Jfile),             VSB1F405.25     
     &                 1,0,ErrorStatus)                                    VSB1F405.26     
                                                                           VSB1F405.27     
      END DO    !JFile                                                     VARCTL1.150    
                                                                           VARCTL1.151    
 999  CONTINUE                                                             VARCTL1.152    
      RETURN                                                               VARCTL1.153    
      END                                                                  VARCTL1.154    
*ENDIF                                                                     VARCTL1.155