*IF DEF,CONTROL,AND,DEF,ATMOS                                              VDF_CT1.2      
C ******************************COPYRIGHT******************************    GTS2F400.11485  
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved.    GTS2F400.11486  
C                                                                          GTS2F400.11487  
C Use, duplication or disclosure of this code is subject to the            GTS2F400.11488  
C restrictions as set forth in the contract.                               GTS2F400.11489  
C                                                                          GTS2F400.11490  
C                Meteorological Office                                     GTS2F400.11491  
C                London Road                                               GTS2F400.11492  
C                BRACKNELL                                                 GTS2F400.11493  
C                Berkshire UK                                              GTS2F400.11494  
C                RG12 2SZ                                                  GTS2F400.11495  
C                                                                          GTS2F400.11496  
C If no contract has been raised with this copy of the code, the use,      GTS2F400.11497  
C duplication or disclosure of it is strictly prohibited.  Permission      GTS2F400.11498  
C to do so must first be obtained in writing from the Head of Numerical    GTS2F400.11499  
C Modelling at the above address.                                          GTS2F400.11500  
C ******************************COPYRIGHT******************************    GTS2F400.11501  
C                                                                          GTS2F400.11502  
CLL Subroutine VDF_CTL -----------------------------------------------     VDF_CT1.3      
CLL                                                                        VDF_CT1.4      
CLL Purpose : Calls VDIF_CTL to add vertical difusion increments           VDF_CT1.5      
CLL                                                                        VDF_CT1.6      
CLL Level 2 control routine                                                VDF_CT1.7      
CLL version for CRAY YMP                                                   VDF_CT1.8      
CLL                                                                        VDF_CT1.9      
CLL  Model            Modification history from model version 3.0:         VDF_CT1.10     
CLL version  Date                                                          VDF_CT1.11     
CLL  3.1    9/02/93 : added comdeck CHSUNITS to define NUNITS for          RS030293.241    
CLL                   comdeck CCONTROL.                                    RS030293.242    
CLL   3.2    13/07/93 Changed CHARACTER*(*) to CHARACTER*(80) for          TS150793.207    
CLL                   portability.  Author Tracey Smith.                   TS150793.208    
CLL  3.2  13/04/93  Dynamic allocation of main arrays. R T H Barnes.       @DYALLOC.3846   
CLL  3.3  15/11/93  Removal of DIAG07 directive. D. Robinson.              DR151193.1      
CLL  3.5  28/03/95  Sub-model changes : Removal of run time constants      ADR1F305.229    
CLL                 from Atmos dump headers. D. Robinson.                  ADR1F305.230    
CLL  3.5  05/06/95  Chgs to SI & STINDEX arrays.  RTHBarnes                GRB4F305.525    
CLL 4.0  02/11/95  Correct age-old typo - CALL TIMER('VDF_CTL',4)          GRB3F400.8      
CLL                should have been CALL TIMER('VDIF_CTL',4). RTHBarnes    GRB3F400.9      
!   4.1  28/05/96  MPP Changes. D. Robinson.                               APBHF401.76     
!LL   4.3  12/02/97  Added PPX arguments to EXTDIAG   P.Burton             GPB1F403.1515   
CLL                                                                        VDF_CT1.12     
CLL Programming standard : unified model documentation paper No 3          VDF_CT1.13     
CLL                                                                        VDF_CT1.14     
CLL Logical components covered : 21                                        VDF_CT1.15     
CLL                                                                        VDF_CT1.16     
CLL System task : P0                                                       VDF_CT1.17     
CLL                                                                        VDF_CT1.18     
CLL Documentation: Unified Model documentation paper No P0                 VDF_CT1.19     
CLL                version No 11 dated (26/11/90)                          VDF_CT1.20     
CLL                                                                        VDF_CT1.21     
CLLEND -----------------------------------------------------------------   VDF_CT1.22     
C*L Arguments                                                              VDF_CT1.23     
                                                                           VDF_CT1.24     

      SUBROUTINE VDF_CTL(U_FIELDDA,P_LEVELSDA,INT7,                         1,9@DYALLOC.3847   
*CALL ARGSIZE                                                              @DYALLOC.3848   
*CALL ARGD1                                                                @DYALLOC.3849   
*CALL ARGDUMA                                                              @DYALLOC.3850   
*CALL ARGDUMO                                                              @DYALLOC.3851   
*CALL ARGDUMW                                                              GKR1F401.283    
*CALL ARGSTS                                                               @DYALLOC.3852   
*CALL ARGPTRA                                                              @DYALLOC.3853   
*CALL ARGPTRO                                                              @DYALLOC.3854   
*CALL ARGCONA                                                              @DYALLOC.3855   
*CALL ARGPPX                                                               GKR0F305.1011   
*CALL ARGFLDPT                                                             APBHF401.77     
     &                   ICODE,CMESSAGE)                                   @DYALLOC.3856   
                                                                           VDF_CT1.26     
      IMPLICIT NONE                                                        VDF_CT1.27     
C                                                                          @DYALLOC.3857   
*CALL CMAXSIZE                                                             @DYALLOC.3858   
*CALL CSUBMODL                                                             GSS1F305.942    
*CALL TYPSIZE                                                              @DYALLOC.3859   
*CALL TYPD1                                                                @DYALLOC.3860   
*CALL TYPDUMA                                                              @DYALLOC.3861   
*CALL TYPDUMO                                                              @DYALLOC.3862   
*CALL TYPDUMW                                                              GKR1F401.284    
*CALL TYPSTS                                                               @DYALLOC.3863   
*CALL TYPPTRA                                                              @DYALLOC.3864   
*CALL TYPPTRO                                                              @DYALLOC.3865   
*CALL TYPCONA                                                              @DYALLOC.3866   
*CALL PPXLOOK                                                              GKR0F305.1012   
*CALL TYPFLDPT                                                             APBHF401.78     
                                                                           VDF_CT1.28     
      INTEGER                                                              VDF_CT1.29     
     &       INT7,        ! Dummy variable for STASH_MAXLEN(7)             VDF_CT1.30     
     &       U_FIELDDA,   ! Extra copy of U_FIELD for dynamic alloc        @DYALLOC.3867   
     &       P_LEVELSDA,  ! and P_LEVELS                                   @DYALLOC.3868   
     &       ICODE        ! Return code : 0 Normal Exit                    VDF_CT1.31     
C                         !             : >0 Error                         VDF_CT1.32     
                                                                           VDF_CT1.33     
      CHARACTER*(80)                                                       TS150793.209    
     &       CMESSAGE     ! Error message if return code >0                VDF_CT1.35     
                                                                           VDF_CT1.36     
*CALL CHSUNITS                                                             RS030293.243    
*CALL CCONTROL                                                             VDF_CT1.38     
*CALL C_OMEGA                                                              VDF_CT1.42     
*CALL CRUNTIMC                                                             ADR1F305.231    
*CALL CTIME                                                                ADR1F305.232    
                                                                           VDF_CT1.43     
CL Dynamically allocated area for stash processing                         VDF_CT1.44     
                                                                           VDF_CT1.45     
      REAL                                                                 VDF_CT1.46     
     &      STASHWORK(INT7)                                                VDF_CT1.47     
                                                                           VDF_CT1.48     
      EXTERNAL VDIF_CTL,TIMER,STASH,EXTDIAG,SET_LEVELS_LIST                DR151193.2      
                                                                           VDF_CT1.56     
C Local variables                                                          VDF_CT1.57     
                                                                           VDF_CT1.58     
      INTEGER                                                              VDF_CT1.59     
     &       I,                                                            VDF_CT1.60     
     &       ROWS,                                                         VDF_CT1.62     
     &       FIRST_POINT,                                                  VDF_CT1.63     
     &       LAST_POINT,                                                   DR151193.3      
     &       LEVELS_VD,        !  No of levels VD to be applied            DR151193.6      
     &       LEVELS_FLUX,      !  No of flux levels                        DR151193.7      
     &       LEN_STASH_U_FLUX, !  )Dimension of workspace in STASHWORK     DR151193.8      
     &       LEN_STASH_V_FLUX, !  )for u/v vertical momentum flux          DR151193.9      
     &       POINTS_FLUX_U,    !  )Dimension of diagnostic arrays          DR151193.10     
     &       POINTS_FLUX_V     !  )for u/v vertical momentum flux          DR151193.11     
     &      ,IM_IDENT      ! internal model identifier                     GRB4F305.526    
     &      ,IM_INDEX      ! internal model index for STASH arrays         GRB4F305.527    
                                                                           VDF_CT1.65     
      REAL                                                                 VDF_CT1.66     
     &       COS_U_TRUE_LATITUDE(U_FIELDDA)                                @DYALLOC.3869   
     &      ,SCALAR                                                        VDF_CT1.68     
                                                                           VDF_CT1.69     
      LOGICAL                                                              VDF_CT1.70     
     &       U_LIST(P_LEVELSDA), ! Levels list for diagnostics             DR151193.12     
     &       V_LIST(P_LEVELSDA)  ! Levels list for diagnostics             DR151193.13     
                                                                           VDF_CT1.73     
CL -- SECTION 7 --- VERTICAL DIFFUSION ----------------                    VDF_CT1.74     
CL 7.0 Initialisation                                                      VDF_CT1.75     
                                                                           VDF_CT1.76     
C  Set up internal model identifier and STASH index                        GRB4F305.528    
      im_ident = atmos_im                                                  GRB4F305.529    
      im_index = internal_model_index(im_ident)                            GRB4F305.530    
                                                                           GRB4F305.531    
CL set  true latitude                                                      VDF_CT1.77     
*IF DEF,GLOBAL                                                             VDF_CT1.78     
      DO I=1,U_FIELD                                                       VDF_CT1.79     
        COS_U_TRUE_LATITUDE(I)=COS_U_LATITUDE(I)                           VDF_CT1.80     
      ENDDO                                                                VDF_CT1.81     
*ELSE                                                                      VDF_CT1.82     
CL set from Coriolis term F3 (=2*omega*sin(lat) )  if not GLOBAL           VDF_CT1.83     
      SCALAR=0.5/OMEGA                                                     VDF_CT1.84     
      DO I=1,U_FIELD                                                       VDF_CT1.85     
        COS_U_TRUE_LATITUDE(I)=SQRT(1.0-(SCALAR*F3(I))*(SCALAR*F3(I)) )    VDF_CT1.86     
      ENDDO                                                                VDF_CT1.87     
*ENDIF                                                                     VDF_CT1.88     
                                                                           VDF_CT1.89     
!  Set grid pointers                                                       APBHF401.79     
      FIRST_POINT = START_POINT_NO_HALO                                    APBHF401.80     
      LAST_POINT  = END_P_POINT_NO_HALO                                    APBHF401.81     
      ROWS        = upd_P_ROWS                                             APBHF401.82     
                                                                           VDF_CT1.94     
      LEVELS_VD = TOP_VDIF_LEVEL - BOTTOM_VDIF_LEVEL + 1                   ADR1F305.233    
                                                                           DR151193.17     
      IF(LTIMER) THEN                                                      VDF_CT1.95     
        CALL TIMER('VDIF_CTL',3)                                           VDF_CT1.96     
      END IF                                                               VDF_CT1.97     
                                                                           VDF_CT1.98     
      LEN_STASH_U_FLUX = 1                                                 DR151193.18     
      LEN_STASH_V_FLUX = 1                                                 DR151193.19     
      POINTS_FLUX_U    = 1                                                 DR151193.20     
      POINTS_FLUX_V    = 1                                                 DR151193.21     
      LEVELS_FLUX      = 1                                                 DR151193.22     
                                                                           DR151193.23     
      IF (SF(0,7)) THEN                                                    DR151193.24     
                                                                           DR151193.25     
      DO I=1,INT7                                                          DR151193.26     
        STASHWORK(I)=0                                                     DR151193.27     
      ENDDO                                                                DR151193.28     
                                                                           VDF_CT1.100    
CL Set levels lists for diagnostics                                        VDF_CT1.101    
                                                                           VDF_CT1.102    
      IF(SF(201,7)) THEN                                                   VDF_CT1.103    
        CALL SET_LEVELS_LIST(P_LEVELS,LEN_STLIST,STLIST(1,STINDEX          VDF_CT1.104    
     &      (1,201,7,im_index)),U_LIST,STASH_LEVELS,NUM_STASH_LEVELS+1,    GRB4F305.532    
     &       ICODE,CMESSAGE)                                               GRB4F305.533    
        IF( ICODE.GT.0) RETURN                                             VDF_CT1.107    
      END IF                                                               VDF_CT1.108    
                                                                           VDF_CT1.109    
      IF(SF(202,7)) THEN                                                   VDF_CT1.110    
        CALL SET_LEVELS_LIST(P_LEVELS,LEN_STLIST,STLIST(1,STINDEX          VDF_CT1.111    
     &      (1,202,7,im_index)),V_LIST,STASH_LEVELS,NUM_STASH_LEVELS+1,    GRB4F305.534    
     &       ICODE,CMESSAGE)                                               GRB4F305.535    
        IF( ICODE.GT.0) RETURN                                             VDF_CT1.114    
      END IF                                                               VDF_CT1.115    
                                                                           VDF_CT1.116    
CL Set diagnostic array dimensions                                         DR151193.31     
      IF (SF(201,7)) THEN                                                  DR151193.32     
        LEN_STASH_U_FLUX = U_FIELD                                         DR151193.33     
        POINTS_FLUX_U = ROWS*ROW_LENGTH                                    DR151193.34     
      ENDIF                                                                DR151193.35     
      IF (SF(202,7)) THEN                                                  DR151193.36     
        LEN_STASH_V_FLUX = U_FIELD                                         DR151193.37     
        POINTS_FLUX_V = ROWS*ROW_LENGTH                                    DR151193.38     
      ENDIF                                                                DR151193.39     
      IF (SF(201,7) .OR. SF(202,7)) THEN                                   DR151193.40     
        LEVELS_FLUX = TOP_VDIF_LEVEL - BOTTOM_VDIF_LEVEL                   ADR1F305.234    
      ENDIF                                                                DR151193.42     
                                                                           DR151193.43     
      ENDIF                                                                DR151193.44     
                                                                           VDF_CT1.118    
CL 7.1 Call VDIF_CTL to calculate all vertical diffusion increments        VDF_CT1.119    
                                                                           VDF_CT1.120    
      CALL VDIF_CTL(                                                       VDF_CT1.121    
C arguments...                                                             VDF_CT1.122    
C primary data in                                                          VDF_CT1.123    
     &     D1(JPSTAR),D1(JU(1)),D1(JV(1)),                                 VDF_CT1.124    
C size and control variables                                               VDF_CT1.125    
     &     P_FIELD,U_FIELD,ROWS,FIRST_ROW,ROW_LENGTH,                      VDF_CT1.126    
     &     BOTTOM_VDIF_LEVEL,TOP_VDIF_LEVEL,LEVELS_VD,P_LEVELS,            ADR1F305.235    
C level and row dependent variables                                        VDF_CT1.128    
     &     A_LEVDEPC(JAK),A_LEVDEPC(JBK),                                  VDF_CT1.129    
     &     A_LEVDEPC(JDELTA_AK),A_LEVDEPC(JDELTA_BK),                      VDF_CT1.130    
     &     COS_U_TRUE_LATITUDE,                                            VDF_CT1.131    
C other constants                                                          VDF_CT1.132    
     &     LATITUDE_BAND,VERTICAL_DIFFUSION,SECS_PER_STEPim(atmos_im),     ADR1F305.236    
C diagnostics                                                              DR151193.46     
     &     STASHWORK(SI(201,7,im_index)),SF(201,7),U_LIST,                 GRB4F305.536    
     &     STASHWORK(SI(202,7,im_index)),SF(202,7),V_LIST,                 GRB4F305.537    
     &     LEN_STASH_U_FLUX,LEN_STASH_V_FLUX,                              DR151193.49     
     &     POINTS_FLUX_U,POINTS_FLUX_V,LEVELS_FLUX,                        DR151193.50     
     &     ICODE)                                                          VDF_CT1.143    
                                                                           VDF_CT1.144    
      IF(LTIMER) THEN                                                      VDF_CT1.145    
        CALL TIMER('VDIF_CTL',4)                                           GRB3F400.10     
      END IF                                                               VDF_CT1.147    
                                                                           VDF_CT1.148    
      IF(ICODE.GT.0) THEN                                                  VDF_CT1.149    
        CMESSAGE='VDIF_CTL: Error in VDIF_CTL'                             VDF_CT1.150    
        RETURN                                                             VDF_CT1.151    
      END IF                                                               VDF_CT1.152    
                                                                           VDF_CT1.153    
      IF (SF(0,7)) THEN    !  Diagnostic processing                        DR151193.51     
                                                                           VDF_CT1.155    
CL Extend diagnostics to full area for STASH processing                    VDF_CT1.156    
CL 7.2 Diagnostic processing                                               VDF_CT1.157    
                                                                           VDF_CT1.158    
      CALL EXTDIAG(STASHWORK,SI(1,7,im_index),SF(1,7),201,202,             GRB4F305.538    
     &             INT7,ROW_LENGTH,                                        VDF_CT1.160    
     &        STLIST,LEN_STLIST,STINDEX(1,1,7,im_index),2,STASH_LEVELS,    GRB4F305.539    
     &             NUM_STASH_LEVELS+1, STASH_PSEUDO_LEVELS,                VDF_CT1.162    
     &             NUM_STASH_PSEUDO,                                       GPB1F403.1516   
     &             im_ident,7,                                             GPB1F403.1517   
*CALL ARGPPX                                                               GPB1F403.1518   
     &             ICODE,CMESSAGE)                                         GPB1F403.1519   
                                                                           VDF_CT1.164    
      IF(ICODE.GT.0) RETURN                                                VDF_CT1.165    
                                                                           VDF_CT1.168    
CL Call STASH to process output                                            VDF_CT1.169    
                                                                           VDF_CT1.170    
      IF(LTIMER) THEN                                                      VDF_CT1.171    
        CALL TIMER('STASH   ',3)                                           VDF_CT1.172    
      END IF                                                               VDF_CT1.173    
                                                                           VDF_CT1.174    
      CALL STASH(a_sm,a_im,7,STASHWORK,                                    GKR0F305.1013   
*CALL ARGSIZE                                                              @DYALLOC.3873   
*CALL ARGD1                                                                @DYALLOC.3874   
*CALL ARGDUMA                                                              @DYALLOC.3875   
*CALL ARGDUMO                                                              @DYALLOC.3876   
*CALL ARGDUMW                                                              GKR1F401.285    
*CALL ARGSTS                                                               @DYALLOC.3877   
*CALL ARGPPX                                                               GKR0F305.1014   
     &           ICODE,CMESSAGE)                                           @DYALLOC.3881   
                                                                           VDF_CT1.176    
      IF(LTIMER) THEN                                                      VDF_CT1.177    
        CALL TIMER('STASH   ',4)                                           VDF_CT1.178    
      END IF                                                               VDF_CT1.179    
                                                                           VDF_CT1.180    
      IF(ICODE.GT.0) RETURN                                                VDF_CT1.181    
                                                                           DR151193.52     
      ENDIF  !  End if diagnostic processing                               DR151193.53     
                                                                           VDF_CT1.182    
      RETURN                                                               VDF_CT1.183    
      END                                                                  VDF_CT1.184    
*ENDIF                                                                     VDF_CT1.185