*IF DEF,CONTROL                                                            EXITCHK1.2      
C ******************************COPYRIGHT******************************    GTS2F400.2629   
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved.    GTS2F400.2630   
C                                                                          GTS2F400.2631   
C Use, duplication or disclosure of this code is subject to the            GTS2F400.2632   
C restrictions as set forth in the contract.                               GTS2F400.2633   
C                                                                          GTS2F400.2634   
C                Meteorological Office                                     GTS2F400.2635   
C                London Road                                               GTS2F400.2636   
C                BRACKNELL                                                 GTS2F400.2637   
C                Berkshire UK                                              GTS2F400.2638   
C                RG12 2SZ                                                  GTS2F400.2639   
C                                                                          GTS2F400.2640   
C If no contract has been raised with this copy of the code, the use,      GTS2F400.2641   
C duplication or disclosure of it is strictly prohibited.  Permission      GTS2F400.2642   
C to do so must first be obtained in writing from the Head of Numerical    GTS2F400.2643   
C Modelling at the above address.                                          GTS2F400.2644   
C ******************************COPYRIGHT******************************    GTS2F400.2645   
C                                                                          GTS2F400.2646   
CLL  Routine: EXITCHEK -------------------------------------------------   EXITCHK1.3      
CLL                                                                        EXITCHK1.4      
CLL  Purpose: Checks for end-of-run condition and returns a logical to     EXITCHK1.5      
CLL           the top level.  There are three reasons for stopping,        EXITCHK1.6      
CLL           namely:                                                      EXITCHK1.7      
CLL           (i)   Model has completed the required integration;          EXITCHK1.8      
CLL           (ii)  Operator has requested model to stop;                  EXITCHK1.9      
CLL           (iii) CPU time remaining is insufficient to complete a       EXITCHK1.10     
CLL                 further batch of timesteps.                            EXITCHK1.11     
CLL                                                                        EXITCHK1.12     
CLL  Tested under compiler:   cft77                                        EXITCHK1.13     
CLL  Tested under OS version: UNICOS 5.1                                   EXITCHK1.14     
CLL                                                                        EXITCHK1.15     
CLL  Author:   T.C.Johns                                                   EXITCHK1.16     
CLL                                                                        EXITCHK1.17     
CLL  Model            Modification history from model version 3.0:         EXITCHK1.18     
CLL version  Date                                                          EXITCHK1.19     
CLL  3.1   02/02/93 : Added comdeck CHSUNITS to define NUNITS for i/o.     RS030293.80     
CLL                                                                        AD050293.196    
CLL   3.1  05/02/93    Portable Fortran unit no assigns                    AD050293.197    
CLL                    Author: A. Dickinson    Reviewer: R. Stratton       AD050293.198    
CLL   3.5    28/03/95 MPP code: Only do check on PE 0 and broadcast        GPB0F305.39     
CLL                   result.                          P.Burton            GPB0F305.40     
CLL  4.1  30/07/96  Introduce Wave sub-model.  M Holt                      WRB1F401.1201   
CLL  4.3  30/05/97  Ignore server failure until have reached end           GKR7F403.1      
CLL                 of ocean part of dump period. K Rogers                 GKR7F403.2      
!LL  4.5  09/11/98  Change test around history file update to work         GKR2F405.1      
!LL                 correctly for slab model. K Rogers                     GKR2F405.2      
CLL                                                                        EXITCHK1.20     
CLL  Programming standard: UM Doc Paper 3, version 1 (15/1/90)             EXITCHK1.21     
CLL                                                                        EXITCHK1.22     
CLL  Logical components covered: C0                                        EXITCHK1.23     
CLL                                                                        EXITCHK1.24     
CLL  Project task: C0                                                      EXITCHK1.25     
CLL                                                                        EXITCHK1.26     
CLL  External documentation: On-line UM document C0 - The top-level        EXITCHK1.27     
CLL                          control system                                EXITCHK1.28     
CLL                                                                        EXITCHK1.29     
CLL  -------------------------------------------------------------------   EXITCHK1.30     
C*L  Interface and arguments: ------------------------------------------   EXITCHK1.31     
C                                                                          EXITCHK1.32     

      SUBROUTINE EXITCHEK                                                   2,1EXITCHK1.33     
     &         ( internal_model, LEXITNOW )                                GKR7F403.3      
C                                                                          EXITCHK1.35     
      IMPLICIT NONE                                                        EXITCHK1.36     
      INTEGER internal_model ! In  - id of current internal model          GKR7F403.4      
      LOGICAL      LEXITNOW  ! Out - True/False flag for stopping          EXITCHK1.37     
C                                                                          EXITCHK1.38     
C*----------------------------------------------------------------------   EXITCHK1.39     
C  Common blocks                                                           EXITCHK1.40     
C                                                                          EXITCHK1.41     
*CALL CHSUNITS                                                             RS030293.81     
*CALL CMAXSIZE                                                             GDR3F305.59     
*CALL CSUBMODL                                                             GDR3F305.60     
*CALL CHISTORY                                                             GDR3F305.61     
*CALL CCONTROL                                                             GDR3F305.62     
*CALL CTIME                                                                EXITCHK1.44     
*IF DEF,MPP                                                                GPB0F305.41     
*CALL PARVARS                                                              GPB0F305.42     
*ENDIF                                                                     GPB0F305.43     
C                                                                          AD050293.200    
C External Subroutines                                                     AD050293.201    
C                                                                          AD050293.202    
      EXTERNAL GET_FILE                                                    AD050293.203    
C                                                                          EXITCHK1.45     
C  Local variables                                                         EXITCHK1.46     
C                                                                          EXITCHK1.47     
      LOGICAL   LERRFLAG ! error flag true/false indicates stop request    EXITCHK1.48     
     &         ,LCHK14   ! true if to check unit 14                        EXITCHK1.49     
      CHARACTER*80 CERRMESS  ! explaination of stop request.               EXITCHK1.50     
      CHARACTER*80 FILENAME                                                AD050293.199    
      INTEGER   ICODE        ! IO status                                   EXITCHK1.51     
*IF DEF,MPP                                                                GPB0F305.44     
      INTEGER end_run   ! integer used in bcast of end_condition state     GPB0F305.45     
      INTEGER info                                                         GPB0F305.46     
*ENDIF                                                                     GPB0F305.47     
C                                                                          EXITCHK1.52     
      DATA LCHK14/.TRUE./                                                  EXITCHK1.53     
C                                                                          EXITCHK1.54     
CL----------------------------------------------------------------------   EXITCHK1.55     
CL 1. Check for completed run (unless means remain to be completed)        EXITCHK1.56     
CL                                                                         EXITCHK1.57     
      IF (.NOT.RUN_MEANS_TO_DO.EQ."Y") THEN                                EXITCHK1.58     
                                                                           EXITCHK1.59     
*IF DEF,ATMOS                                                              EXITCHK1.60     
*IF -DEF,OCEAN,AND,-DEF,SLAB                                               EXITCHK1.61     
        LEXITNOW = ( STEPim(a_im).GE.TARGET_END_STEPim(a_im) )             GDR3F305.63     
*ELSEIF DEF,OCEAN                                                          GDR3F305.64     
        LEXITNOW = ( STEPim(a_im).GE.TARGET_END_STEPim(a_im) .AND.         GDR3F305.65     
     &               STEPim(o_im).GE.TARGET_END_STEPim(o_im) )             GDR3F305.66     
*ELSEIF DEF,SLAB                                                           GDR3F305.67     
        LEXITNOW = ( STEPim(a_im).GE.TARGET_END_STEPim(a_im) .AND.         GDR3F305.68     
     &               STEPim(s_im).GE.TARGET_END_STEPim(s_im) )             GDR3F305.69     
*ENDIF                                                                     EXITCHK1.66     
*ELSE                                                                      EXITCHK1.67     
*IF DEF,OCEAN                                                              EXITCHK1.68     
        LEXITNOW = ( STEPim(o_im).GE.TARGET_END_STEPim(o_im) )             GDR3F305.70     
*ENDIF                                                                     EXITCHK1.70     
*ENDIF                                                                     EXITCHK1.71     
                                                                           EXITCHK1.72     
*IF DEF,WAVE                                                               WRB1F401.1202   
        LEXITNOW = ( STEPim(w_im).GE.TARGET_END_STEPim(w_im) )             WRB1F401.1203   
*ENDIF                                                                     WRB1F401.1204   
      ENDIF                                                                EXITCHK1.73     
CL----------------------------------------------------------------------   EXITCHK1.74     
CL 2. Check for server stop request.                                       EXITCHK1.75     
CL                                                                         EXITCHK1.76     
      IF (MODEL_STATUS.NE."Operational".AND.LCHK14) THEN                   EXITCHK1.77     
!     Ignore server failure until have reached end of ocean part of        GKR7F403.5      
!     dump period so correct restart dumps are available in coupled        GKR7F403.6      
!     models where the dump frequency is different to the coupling         GKR7F403.7      
!     period.  (May not be needed once a permanent fix is done.)           GKR7F403.8      
      IF (.NOT. (N_SUBMODEL_PARTITION .GT.1 .AND.                          GKR2F405.3      
     &    SUBMODEL_FOR_SM(INTERNAL_MODEL)                                  GKR2F405.4      
     &    .ne. SUBMODEL_PARTITION_LIST(N_SUBMODEL_PARTITION))) then        GKR2F405.5      
*IF DEF,MPP                                                                GPB0F305.48     
      IF (mype .EQ. 0) THEN                                                GPB0F305.49     
*ENDIF                                                                     GPB0F305.50     
        CALL GET_FILE(14,FILENAME,80,ICODE)                                GTD0F400.154    
        OPEN(14,FILE=FILENAME,ERR=900,IOSTAT=ICODE)                        AD050293.205    
        READ(14,10,ERR=902,IOSTAT=ICODE) LERRFLAG,CERRMESS                 EXITCHK1.79     
   10   FORMAT(L1,A80)                                                     EXITCHK1.80     
        CLOSE(14)                                                          EXITCHK1.81     
*IF DEF,MPP                                                                GPB0F305.51     
      IF (LERRFLAG) THEN                                                   GPB0F305.52     
        end_run=1                                                          GPB0F305.53     
      ELSE                                                                 GPB0F305.54     
        end_run=0                                                          GPB0F305.55     
      ENDIF                                                                GPB0F305.56     
      ENDIF                                                                GPB0F305.57     
                                                                           GPB0F305.58     
      CALL GC_IBCAST(1,1,0,nproc,info,end_run)                             GPB0F305.59     
                                                                           GPB0F305.60     
      IF (end_run .EQ. 1) THEN                                             GPB0F305.61     
        LERRFLAG=.TRUE.                                                    GPB0F305.62     
        IF (mype .NE. 0) THEN                                              GPB0F305.63     
          CERRMESS='PE 0 Signaled a sever stop request'                    GPB0F305.64     
        ENDIF                                                              GPB0F305.65     
      ELSE                                                                 GPB0F305.66     
        LERRFLAG=.FALSE.                                                   GPB0F305.67     
      ENDIF                                                                GPB0F305.68     
*ENDIF                                                                     GPB0F305.69     
C                                                                          EXITCHK1.82     
        IF (LERRFLAG) THEN                                                 EXITCHK1.83     
          WRITE(6,*)'EXITCHK: Request to stop model run received'          GIE0F403.144    
          WRITE(6,*)CERRMESS                                               GIE0F403.145    
          LEXITNOW=.TRUE.                                                  EXITCHK1.86     
        END IF                                                             EXITCHK1.87     
      END IF                                                               GKR7F403.11     
      END IF                                                               EXITCHK1.88     
CL----------------------------------------------------------------------   EXITCHK1.89     
CL 3. Check for insufficient time to complete a batch of timesteps         EXITCHK1.90     
CL      .. not yet implemented                                             EXITCHK1.91     
CL                                                                         EXITCHK1.92     
      RETURN                                                               EXITCHK1.93     
CL----------------------------------------------------------------------   EXITCHK1.94     
CL   Error exits                                                           EXITCHK1.95     
CL                                                                         EXITCHK1.96     
  900 WRITE(6,*)'EXITCHK: Error trying to open unit 14 error flag'         GIE0F403.146    
      LCHK14=.FALSE.                                                       EXITCHK1.98     
      RETURN                                                               EXITCHK1.99     
C                                                                          EXITCHK1.100    
  902 WRITE(6,*)'EXITCHK: Error trying to read unit 14 error flag'         GIE0F403.147    
      LCHK14=.FALSE.                                                       EXITCHK1.102    
      RETURN                                                               EXITCHK1.103    
CL----------------------------------------------------------------------   EXITCHK1.104    
      END                                                                  EXITCHK1.105    
*ENDIF                                                                     EXITCHK1.106