*IF DEF,CONTROL                                                            SETGRCT1.2      
C ******************************COPYRIGHT******************************    GTS2F400.8587   
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved.    GTS2F400.8588   
C                                                                          GTS2F400.8589   
C Use, duplication or disclosure of this code is subject to the            GTS2F400.8590   
C restrictions as set forth in the contract.                               GTS2F400.8591   
C                                                                          GTS2F400.8592   
C                Meteorological Office                                     GTS2F400.8593   
C                London Road                                               GTS2F400.8594   
C                BRACKNELL                                                 GTS2F400.8595   
C                Berkshire UK                                              GTS2F400.8596   
C                RG12 2SZ                                                  GTS2F400.8597   
C                                                                          GTS2F400.8598   
C If no contract has been raised with this copy of the code, the use,      GTS2F400.8599   
C duplication or disclosure of it is strictly prohibited.  Permission      GTS2F400.8600   
C to do so must first be obtained in writing from the Head of Numerical    GTS2F400.8601   
C Modelling at the above address.                                          GTS2F400.8602   
C ******************************COPYRIGHT******************************    GTS2F400.8603   
C                                                                          GTS2F400.8604   
CLL  Routine: SETGRCTL -------------------------------------------------   SETGRCT1.3      
CLL                                                                        SETGRCT1.4      
CLL  Purpose: Sets timestep group control switches.                        SETGRCT1.5      
CLL                                                                        SETGRCT1.6      
CLL  Tested under compiler:   cft77                                        SETGRCT1.7      
CLL  Tested under OS version: UNICOS 5.1                                   SETGRCT1.8      
CLL                                                                        SETGRCT1.9      
CLL  Author:   T.C.Johns                                                   SETGRCT1.10     
CLL                                                                        SETGRCT1.11     
CLL  Model            Modification history from model version 3.0:         SETGRCT1.12     
CLL version  date                                                          SETGRCT1.13     
CLL   3.1   8/02/93 : Changed order of comdecks to define NUNITS for       RS030293.221    
CLL                   comdeck CCONTROL.                                    RS030293.222    
CLL   3.2    13/07/93 Changed CHARACTER*(*) to CHARACTER*(80) for          TS150793.174    
CLL                   portability.  Author Tracey Smith.                   TS150793.175    
CLL   3.3  02/12/93  Generalise code for submodels and shared data         TJ061293.54     
CLL                  partitions in coupled models (eg. SLAB).   (TCJ)      TJ061293.55     
CLL                                                                        SETGRCT1.14     
CLL   3.5  18/04/95  Stage 1 of submodel project: partial generalise       GRR2F305.512    
CLL                  to arbitrary submodels. R. Rawlins                    GRR2F305.513    
CLL  4.1  17/04/96  Introduce wave sub-model.  RTHBarnes.                  WRB1F401.736    
CLL                                                                        SETGRCT1.15     
CLL  Programming standard: UM Doc Paper 3, version 1 (15/1/90)             SETGRCT1.16     
CLL                                                                        SETGRCT1.17     
CLL  Logical components covered: C0                                        SETGRCT1.18     
CLL                                                                        SETGRCT1.19     
CLL  Project task: C0                                                      SETGRCT1.20     
CLL                                                                        SETGRCT1.21     
CLL  External documentation: On-line UM document C0 - The top-level        SETGRCT1.22     
CLL                          control system                                SETGRCT1.23     
CLL                                                                        SETGRCT1.24     
CLL  -------------------------------------------------------------------   SETGRCT1.25     
C*L  Interface and arguments: ------------------------------------------   SETGRCT1.26     
C                                                                          SETGRCT1.27     

      SUBROUTINE SETGRCTL (internal_model,submodel,NGROUP,                  2GRR2F305.514    
     *                     ICODE,CMESSAGE)                                 GRR2F305.515    
C                                                                          TJ061293.57     
      IMPLICIT NONE                                                        SETGRCT1.29     
C                                                                          TJ061293.58     
      INTEGER MODEL_DUMP_NUMBER(4)                                         GSS1F305.936    
      INTEGER internal_model  ! OUT - internal model id to run next        GRR2F305.516    
      INTEGER submodel        ! OUT - submodel id for dump partition       GRR2F305.517    
      INTEGER NGROUP          ! OUT - Number of steps in "group"           GRR2F305.518    
      INTEGER ICODE           ! Out - Return code                          GRR2F305.519    
      CHARACTER*(80) CMESSAGE ! Out - Error message                        GRR2F305.520    
C                                                                          SETGRCT1.34     
C*----------------------------------------------------------------------   SETGRCT1.35     
C  Common blocks                                                           SETGRCT1.36     
C                                                                          SETGRCT1.37     
*CALL CMAXSIZE                                                             GDR3F305.166    
*CALL CSUBMODL                                                             GRR2F305.521    
*CALL CHSUNITS                                                             GDR3F305.167    
*CALL CHISTORY                                                             RS030293.223    
*CALL CCONTROL                                                             SETGRCT1.38     
*CALL CTIME                                                                SETGRCT1.40     
C                                                                          SETGRCT1.41     
C  Local variables                                                         SETGRCT1.42     
! Temporary assignment to be replaced by node navigate at later stage      GRR2F305.522    
      INTEGER im      ! temporary internal model id for ocean or slab      GRR2F305.523    
                                                                           GRR2F305.524    
C                                                                          SETGRCT1.43     
CL----------------------------------------------------------------------   SETGRCT1.44     
CL 1. Set timestep group control data using history file information,      SETGRCT1.45     
CL    and model step numbers accumulated in CTIME                          SETGRCT1.46     
CL                                                                         SETGRCT1.47     
!                                                                          GRR2F305.525    
! Hardwire settings follow, awaiting replacement by node navigation code   GRR2F305.526    
!                                                                          GRR2F305.527    
*IF DEF,ATMOS                                                              SETGRCT1.49     
*IF DEF,OCEAN                                                              GRR2F305.528    
      im=ocean_im                                                          GRR2F305.529    
*ENDIF Ocean                                                               GRR2F305.530    
*IF DEF,SLAB                                                               GRR2F305.531    
      im= slab_im                                                          GRR2F305.532    
*ENDIF Slab                                                                GRR2F305.533    
*IF DEF,OCEAN,OR,DEF,SLAB                                                  SETGRCT1.50     
                                                                           GRR2F305.534    
! Check if ocean/slab has completed the same number of groups as atmos     GRR2F305.535    
      IF( (STEPim(atmos_im)/GROUPim(atmos_im) ).EQ.                        GRR2F305.536    
     *    (STEPim(      im)/GROUPim(      im) ) ) THEN                     GRR2F305.537    
        internal_model=atmos_im                                            GRR2F305.538    
      ELSE                                                                 SETGRCT1.57     
        internal_model=      im    ! either slab or ocean                  GRR2F305.539    
      ENDIF                                                                GRR2F305.540    
*ELSE Not OCEAN or SLAB                                                    GRR2F305.541    
      internal_model=atmos_im                                              GRR2F305.542    
*ENDIF on OCEAN or SLAB                                                    GRR2F305.543    
                                                                           GRR2F305.544    
*ELSE Not ATMOS                                                            GRR2F305.545    
*IF DEF,OCEAN                                                              TJ061293.63     
      internal_model=ocean_im                                              GRR2F305.546    
*ELSE                                                                      SETGRCT1.76     
*IF DEF,WAVE                                                               WRB1F401.737    
!  This construct is only valid while the wave sub-model in not coupled    WRB1F401.738    
!   to any other sub-model.                                                WRB1F401.739    
      internal_model=wave_im                                               WRB1F401.740    
*ELSE                                                                      WRB1F401.741    
      ICODE=1                                                              SETGRCT1.77     
      CMESSAGE="SETGRCTL : Illegal sub-model type, not ATMOS, OCEAN or     WRB1F401.742    
     & WAVE"                                                               WRB1F401.743    
*ENDIF on WAVE                                                             WRB1F401.744    
*ENDIF on OCEAN                                                            GRR2F305.547    
*ENDIF on ATMOS                                                            GRR2F305.548    
                                                                           GRR2F305.549    
!!                                                                         GRR2F305.550    
!! 1.1 Determine if a new internal model or submodel for next group.       GRR2F305.551    
!!     {More generalisation needed later to cater for more complex         GRR2F305.552    
!!     coupling cases.}                                                    GRR2F305.553    
!!                                                                         GRR2F305.554    
                                                                           GRR2F305.555    
      IF(STEPim(internal_model).EQ.0 ) THEN ! Initial time, must be new    GRR2F305.556    
         new_im=.true.                                                     GRR2F305.557    
         new_sm=.true.                                                     GRR2F305.558    
      ELSE                                                                 GRR2F305.559    
         new_im=.false.                                                    GRR2F305.560    
         new_sm=.false.                                                    GRR2F305.561    
      ENDIF  ! Test for initial step                                       GRR2F305.562    
                                                                           GRR2F305.563    
      IF( N_INTERNAL_MODEL.GT.1) THEN ! ie coupled model                   GRR2F305.564    
! Check if end of group reached                                            GRR2F305.565    
         IF(mod(                                                           GRR2F305.566    
     *       STEPim(internal_model),GROUPim(internal_model)).EQ.0) THEN    GRR2F305.567    
             new_im=.true.            ! New internal model next            GRR2F305.568    
                                                                           GRR2F305.569    
             IF( N_SUBMODEL_PARTITION.GT.1) THEN ! ie coupled submodels    GRR2F305.570    
                new_sm=.true.                                              GRR2F305.571    
             ENDIF                        ! Coupled submodel               GRR2F305.572    
                                                                           GRR2F305.573    
         ENDIF                    ! Timestep at end of group               GRR2F305.574    
      ENDIF              ! Coupled model                                   GRR2F305.575    
                                                                           GRR2F305.576    
!!                                                                         GRR2F305.577    
!! 1.2 Find submodel partition (ie D1/dump) identifier.                    GRR2F305.578    
!!                                                                         GRR2F305.579    
      submodel=SUBMODEL_PARTITION_INDEX(internal_model)                    GRR2F305.580    
                                                                           GRR2F305.581    
CL   Find group of timesteps for next internal model                       GRR2F305.582    
      NGROUP  = GROUPim(internal_model)                                    GRR2F305.583    
                                                                           GRR2F305.584    
CL   Set switches as necessary for control variables held in               GRR2F305.585    
CL   CHISTORY and CCONTROL. {These are held over from 3.4 and              GRR2F305.586    
CL   could probably be removed, to be replaced by more generic items.}     GRR2F305.587    
      LATMOSNEXT=.FALSE.                                                   GRR2F305.588    
      LOCEANNEXT=.FALSE.                                                   GRR2F305.589    
      RUN_OCEAN_FIRST="N"                                                  GRR2F305.590    
      IF(internal_model.EQ.atmos_im) THEN                                  GRR2F305.591    
          LATMOSNEXT=.TRUE.                                                GRR2F305.592    
      ELSEIF(internal_model.EQ.ocean_im) THEN                              GRR2F305.593    
          LOCEANNEXT=.TRUE.                                                GRR2F305.594    
          RUN_OCEAN_FIRST="Y"                                              GRR2F305.595    
      ELSEIF(internal_model.NE.slab_im .and.                               WRB1F401.745    
     &       internal_model.ne.wave_im) THEN                               WRB1F401.746    
          ICODE=1                                                          GRR2F305.597    
          CMESSAGE=                                                        GRR2F305.598    
     &  "SETGRCTL : Illegal sub-model type, not ATMOS, OCEAN or WAVE"      WRB1F401.747    
          write(6,*) CMESSAGE                                              GRR2F305.600    
          write(6,*) 'illegal internal_model=',internal_model              GRR2F305.601    
      ENDIF                                                                GRR2F305.602    
                                                                           GRR2F305.603    
c diagnostic write start                                                   GRR2F305.604    
      write(6,*) 'im,sm,ngroup,new_im,new_sm',                             GRR2F305.605    
     *  internal_model,submodel,ngroup,new_im,new_sm                       GRR2F305.606    
c diagnostic write end                                                     GRR2F305.607    
C                                                                          TJ061293.71     
      RETURN                                                               SETGRCT1.82     
CL----------------------------------------------------------------------   SETGRCT1.83     
      END                                                                  SETGRCT1.84     
*ENDIF                                                                     SETGRCT1.85