*IF DEF,CONTROL                                                            INITTIM1.2      
C ******************************COPYRIGHT******************************    GTS2F400.4879   
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved.    GTS2F400.4880   
C                                                                          GTS2F400.4881   
C Use, duplication or disclosure of this code is subject to the            GTS2F400.4882   
C restrictions as set forth in the contract.                               GTS2F400.4883   
C                                                                          GTS2F400.4884   
C                Meteorological Office                                     GTS2F400.4885   
C                London Road                                               GTS2F400.4886   
C                BRACKNELL                                                 GTS2F400.4887   
C                Berkshire UK                                              GTS2F400.4888   
C                RG12 2SZ                                                  GTS2F400.4889   
C                                                                          GTS2F400.4890   
C If no contract has been raised with this copy of the code, the use,      GTS2F400.4891   
C duplication or disclosure of it is strictly prohibited.  Permission      GTS2F400.4892   
C to do so must first be obtained in writing from the Head of Numerical    GTS2F400.4893   
C Modelling at the above address.                                          GTS2F400.4894   
C ******************************COPYRIGHT******************************    GTS2F400.4895   
C                                                                          GTS2F400.4896   
CLL  Routine: INITTIME -------------------------------------------------   INITTIM1.3      
CLL                                                                        INITTIM1.4      
CLL  Purpose: Initialises the model time relative to the calendar zero     INITTIM1.5      
CLL           time.  The basis time is converted to a time in seconds      INITTIM1.6      
CLL           since T=0 with respect to the calendar. If the model basis   INITTIM1.7      
CLL           time as specified via the history file does not match the    INITTIM1.8      
CLL           data time in the dump(s), an error is flagged and the        INITTIM1.9      
CLL           routine exits.                                               INITTIM1.10     
CLL           Also sets derived time information from supplied time        INITTIM1.11     
CLL           information:-                                                INITTIM1.12     
CLL           (a) Assimilation start/end timesteps;                        INITTIM1.13     
CLL           (b) Interface field generation start/end steps and length;   INITTIM1.14     
CLL           (c) Real timestep(s) in seconds.                             INITTIM1.15     
CLL                                                                        INITTIM1.16     
CLL  Tested under compiler:   cft77                                        INITTIM1.17     
CLL  Tested under OS version: UNICOS 6.1.5A                                INITTIM1.18     
CLL                                                                        INITTIM1.19     
CLL  Author:   T.C.Johns                                                   INITTIM1.20     
CLL                                                                        INITTIM1.21     
CLL  Model            Modification history from model version 3.0:         INITTIM1.22     
CLL version  date                                                          INITTIM1.23     
CLL  3.1   3/02/93  : added comdeck CHSUNITS to define NUNITS for i/o.     RS030293.159    
CLL                                                                        INITTIM1.24     
CLL 3.1    3/2/93     Initialisation of A_INTERFACE_FSTEP/LSTEP/STEPS      DR240293.853    
CLL                   removed ; now done in INTF_CTL. D Robinson           DR240293.854    
CLL   3.2    13/07/93 Changed CHARACTER*(*) to CHARACTER*(80) for          TS150793.93     
CLL                   portability.  Author Tracey Smith.                   TS150793.94     
CLL 3.2    27/03/93 Dynamic allocation of main data arrays. R. Rawlins     TJ080294.96     
CLL   3.3  08/02/94  Modify calls to TIME2SEC/SEC2TIME to output/input     TJ080294.97     
CLL                  elapsed times in days & secs, for portability.        TJ080294.98     
CLL                  Check conformity of ocean t/s definition.      TCJ    TJ080294.99     
CLL                                                                        DR240293.855    
CLL  3.3 Ocean assimilation step numbers changed to enable assimilation    MB031293.1      
CLL      in continuation runs to work satisfactorily.                      MB031293.2      
CLL   3.4  20/06/94  DEF CAL360 replaced by LOGICAL LCAL360                GSS1F304.420    
CLL                  LCAL360 passed to TIME2SEC, SEC2TIME                  GSS1F304.421    
CLL                                                     S.J.Swarbrick      GSS1F304.422    
CLL   3.5  18/04/95  Stage 1 of submodel project, some generalisation      GRB1F305.184    
CLL                  of step counters. R. Rawlins                          GRB1F305.185    
CLL  4.0  25/10/95  Allow user to control auto resubmit. RTHBarnes         GRB3F400.5      
CLL  4.0  16/08/95  Remove erroneous IF tests introduced at vn3.5. RTHB    GRB1F400.26     
CLL  4.0  06/12/95  Recover model_basis_time from model_data_time (for     GRB1F400.27     
CLL                 operational assimilation runs mainly).  RTHBarnes      GRB1F400.28     
CLL  4.0  14/12/95  Make sure warning message printed if STEPim reset.     GRB1F400.29     
CLL  4.1  26/03/96  Introduce Wave sub-model.  RTHBarnes.                  WRB1F401.536    
CLL  4.1  3/6/96    In f/c mode, use time from dump if Basis time is zer   VSB1F401.77     
CLL                 (as is done in assm mode). Stuart Bell                 VSB1F401.78     
CLL  4.4  10/01/97  Allow addition of timestep to ASSIM_FIRSTSTEP for      ORW0F404.1      
CLL                NON-OPERATIONAL runs only. This allows assimilation     ORW0F404.2      
CLL                to be restarted in a non-operational CRUN model run.    ORW0F404.3      
CLL                                                        R. Watkins.     ORW0F404.4      
CLL                                                                        MB031293.3      
CLL  4.1  16/02/96  Synchronysed resubmision and meaning points            GGH1F401.1      
CLL                 for CRUNs. G Henderson                                 GGH1F401.2      
!LL  4.3  26/02/97  Correct error in argument list of SEC2TIME             ARB2F403.156    
!LL                 introduced in modset GRB1F400.  RTHBarnes.             ARB2F403.157    
CLL  4.4  21/10/97  If running in IAU mode, read in data time of IAU       VSB2F404.28     
CLL                 dump and calculate MODEL_ANALYSIS_HRS. Also,           VSB2F404.29     
CLL                 correction to FORECAST_HRS calculation.                VSB2F404.30     
CLL                 Adam Clayton.                                          VSB2F404.31     
!LL  4.5  07/07/98  Correct problem with resubmitting runs                 GSM2F405.14     
!LL                 getting wrong interval. S.D.Mullerworth                GSM2F405.15     
CLL                                                                        VSB2F404.32     
CLL  Programming standard: UM Doc Paper 3, version 2 (7/9/90)              INITTIM1.25     
CLL                                                                        INITTIM1.26     
CLL  Logical components covered: C0                                        INITTIM1.27     
CLL                                                                        INITTIM1.28     
CLL  Project task: C0                                                      INITTIM1.29     
CLL                                                                        INITTIM1.30     
CLL  External documentation: On-line UM document C0 - The top-level        INITTIM1.31     
CLL                          control system                                INITTIM1.32     
CLL                                                                        INITTIM1.33     
CLL  -------------------------------------------------------------------   INITTIM1.34     
C*L  Interface and arguments: ------------------------------------------   INITTIM1.35     
C                                                                          INITTIM1.36     

      SUBROUTINE INITTIME(                                                  2,25@DYALLOC.2058   
*CALL ARGSIZE                                                              @DYALLOC.2059   
*CALL ARGDUMA                                                              @DYALLOC.2060   
*CALL ARGDUMO                                                              @DYALLOC.2061   
*CALL ARGDUMW                                                              WRB1F401.537    
     &           submodel,ICODE,CMESSAGE)                                  GRB1F305.186    
C                                                                          INITTIM1.38     
      IMPLICIT NONE                                                        INITTIM1.39     
C                                                                          INITTIM1.40     
      INTEGER      submodel     ! IN  - submodel dump identifier           GRB1F305.187    
*CALL TYPSIZE                                                              @DYALLOC.2063   
*CALL TYPDUMA                                                              @DYALLOC.2064   
*CALL TYPDUMO                                                              @DYALLOC.2065   
*CALL TYPDUMW                                                              WRB1F401.538    
      INTEGER      ICODE        ! OUT - Error return code                  INITTIM1.42     
      CHARACTER*80 CMESSAGE                                                TS150793.95     
C                                                                          INITTIM1.44     
C*----------------------------------------------------------------------   INITTIM1.45     
C  Common blocks                                                           INITTIM1.46     
C                                                                          INITTIM1.47     
*CALL CMAXSIZE                                                             GRB1F305.188    
*CALL CSUBMODL                                                             GRB1F305.189    
*CALL CHSUNITS                                                             RS030293.160    
*CALL CCONTROL                                                             INITTIM1.48     
*CALL CHISTORY                                                             GRB1F305.190    
*CALL CTIME                                                                INITTIM1.54     
C                                                                          INITTIM1.55     
C  Subroutines called                                                      INITTIM1.56     
C                                                                          INITTIM1.57     
      EXTERNAL TIME2SEC,SEC2TIME,TIM2STEP                                  TJ080294.100    
C                                                                          INITTIM1.59     
C  Local variables                                                         INITTIM1.60     
C                                                                          INITTIM1.61     
      LOGICAL                                                              INITTIM1.62     
     1     L_DT_ERROR              ! Flag for Data Time error              INITTIM1.63     
      INTEGER                                                              INITTIM1.64     
     1     ICAL                    ! 1: Gregorian, 2: 360 day calendar     INITTIM1.65     
      INTEGER                                                              INITTIM1.66     
     1     ELAPSED_DAYS         ! Whole days from basis time to VT etc.    TJ080294.101    
     &,    ELAPSED_SECS         ! Secs-in-day from basis time to VT etc.   TJ080294.102    
     &,    DATA_MINUS_BASIS_DAYS! Whole days from basis time to DT         TJ080294.103    
     &,    DATA_MINUS_BASIS_SECS! Secs-in-day from basis time to DT        TJ080294.104    
     &,    LAST_RUN_DAYS        ! Days from basis time to last run end     TJ080294.105    
     1,    LAST_RUN_SECS        ! Secs from basis time to last run end     INITTIM1.68     
     &,    INCREMENT_DAYS       ! Days for increment period                TJ080294.106    
     1,    INCREMENT_SECS       ! Secs for increment period                INITTIM1.69     
     &,    FINAL_DAYS           ! Target in whole days                     TJ080294.107    
     1,    FINAL_SECS           ! Target in secs                           INITTIM1.70     
      INTEGER I                    ! Loop counter                          INITTIM1.71     
     &,       ICOUNT               ! job count                             INITTIM1.72     
      CHARACTER*6                                                          INITTIM1.73     
     &        CDUMMY               ! used in setting job prefix            INITTIM1.74     
                                                                           GRB1F305.191    
      INTEGER                                                              GRB1F305.192    
     * im                          ! internal model id index               GRB1F305.193    
     *,ii                          ! internal model loop counter           GRB1F305.194    
     *,STEP                                                                GRB1F305.195    
     *,STEPS_PER_PERIOD                                                    GRB1F305.196    
     *,SECS_PER_PERIOD                                                     GRB1F305.197    
     &,A_STEPS_PER_HR                                                      GRB1F305.198    
     *,GROUP                                                               GRB1F305.199    
     *,TARGET_END_STEP                                                     GRB1F305.200    
     *,H_STEP                                                              GRB1F305.201    
     *,H_GROUP                                                             GRB1F305.202    
                                                                           VSB2F404.33     
      INTEGER                                                              VSB2F404.34     
     * IAU_UNIT             ! Unit for IAU dump                            VSB2F404.35     
     *,IAU_FIXHD(LEN_FIXHD) ! IAU fixed length header                      VSB2F404.36     
     *,IAU_TIME_DAYS        ! Days after basis time of IAU data time       VSB2F404.37     
     *,IAU_TIME_SECS        ! Secs after basis time of IAU data time       VSB2F404.38     
                                                                           VSB2F404.39     
      LOGICAL                                                              GRB1F305.203    
     * NewRun            ! =T: NRUN, ie no internal model steps yet        GRB1F305.204    
     *,ZeroBasis         ! =T: MODEL_BASIS_TIME=0                          VSB1F401.79     
CL                                                                         INITTIM1.75     
CL----------------------------------------------------------------------   INITTIM1.76     
CL 0. If at start of integration (ie. step numbers both at zero),          INITTIM1.77     
CL     set MODEL_BASIS_TIME from validity time of start dump if run is     INITTIM1.78     
CL     an assimilation or pseudo-assimilation or if MODEL_BASIS_TIME is    VSB1F401.80     
CL     zero (time checking assumed between model time and observations).   VSB1F401.81     
CL     Check that timestep definitions are valid.                          TJ080294.108    
CL     Set MODEL_DATA_TIME from start dump data time in all cases.         INITTIM1.81     
CL                                                                         INITTIM1.82     
! Check for new run (NRUN) or continuation run (CRUN)                      GRB1F305.205    
      NewRun=.true.                                                        GRB1F305.206    
      DO ii=1,N_INTERNAL_MODEL                                             GRB1F305.207    
        im=INTERNAL_MODEL_LIST(ii)                                         GRB1F305.208    
        IF(H_STEPim(im).NE.0) THEN    ! CRUN, continuation run             GRB1F305.209    
           NewRun=.false.                                                  GRB1F305.210    
        ENDIF                                                              GRB1F305.211    
      ENDDO ! ii over internal models                                      GRB1F305.212    
                                                                           GRB1F305.213    
! Check for MODEL_BASIS_TIME zero                                          VSB1F401.82     
      ZeroBasis=.true.                                                     VSB1F401.83     
      DO I=1,6                                                             VSB1F401.84     
        IF(MODEL_BASIS_TIME(I).NE.0)THEN                                   VSB1F401.85     
           ZeroBasis=.false.                                               VSB1F401.86     
        ENDIF                                                              VSB1F401.87     
      ENDDO                                                                VSB1F401.88     
                                                                           VSB1F401.89     
      IF (NewRun) THEN                                                     GRB1F305.214    
*IF DEF,ATMOS                                                              INITTIM1.84     
        IF ((MODEL_ASSIM_MODE.EQ."Atmosphere".OR.                          INITTIM1.85     
     2       MODEL_ASSIM_MODE.EQ."Coupled   ") .AND.                       INITTIM1.86     
     3      (RUN_ASSIM_MODE.EQ."Atmosphere".OR.                            INITTIM1.87     
     4       RUN_ASSIM_MODE.EQ."Coupled   "))  THEN                        INITTIM1.88     
          DO I=1,6                                                         INITTIM1.89     
            MODEL_BASIS_TIME(I)=A_FIXHD(27+I)                              INITTIM1.90     
          ENDDO                                                            INITTIM1.91     
        ELSEIF ( .NOT.                                                     VSB1F401.90     
     1    ((MODEL_ASSIM_MODE.EQ."Atmosphere".OR.                           VSB1F401.91     
     2      MODEL_ASSIM_MODE.EQ."Coupled   ") .AND.                        VSB1F401.92     
     3     (RUN_ASSIM_MODE.EQ."Atmosphere".OR.                             VSB1F401.93     
     4      RUN_ASSIM_MODE.EQ."Coupled   "))                               VSB1F401.94     
     5    .AND.ZeroBasis) THEN                                             VSB1F401.95     
          DO I=1,6                                                         VSB1F401.96     
            MODEL_BASIS_TIME(I)=A_FIXHD(27+I)                              VSB1F401.97     
          ENDDO                                                            VSB1F401.98     
*ENDIF                                                                     INITTIM1.92     
*IF DEF,OCEAN,AND,-DEF,ATMOS                                               INITTIM1.93     
      IF (MODEL_ASSIM_MODE .EQ. "Ocean     " .AND.                         INITTIM1.94     
     2      RUN_ASSIM_MODE.EQ."Ocean     ")  THEN                          INITTIM1.95     
          DO I=1,6                                                         INITTIM1.96     
            MODEL_BASIS_TIME(I)=O_FIXHD(27+I)                              INITTIM1.97     
          ENDDO                                                            INITTIM1.98     
*ENDIF                                                                     INITTIM1.99     
*IF DEF,WAVE,AND,-DEF,OCEAN,AND,-DEF,ATMOS                                 WRB1F401.539    
      IF (MODEL_ASSIM_MODE .EQ. "Wave      " .AND.                         WRB1F401.540    
     &      RUN_ASSIM_MODE.EQ."Wave      ")  THEN                          WRB1F401.541    
          DO I=1,6                                                         WRB1F401.542    
            MODEL_BASIS_TIME(I)=W_FIXHD(27+I)                              WRB1F401.543    
          ENDDO                                                            WRB1F401.544    
*ENDIF                                                                     WRB1F401.545    
        ENDIF                                                              INITTIM1.100    
                                                                           GRB1F305.215    
*IF DEF,OCEAN,OR,DEF,SLAB,OR,DEF,WAVE                                      WRB1F401.546    
CL  Validate that timestep definitions are acceptable to internal clock    TJ080294.109    
CL  algorithm - ie. periods defining a multiple of the basic timestep      TJ080294.110    
CL  are in all cases an exact number of days.                              TJ080294.111    
! This check should not be necessary when submodel changes complete        GRB1F305.217    
        DO ii=1,N_INTERNAL_MODEL                                           GRB1F305.218    
           im=INTERNAL_MODEL_LIST(ii)                                      GRB1F305.219    
!          Skip check for atmos model                                      GRB1F305.220    
           IF (im.ne.atmos_im) then                                        GRB1F305.221    
           SECS_PER_PERIOD=SECS_PER_PERIODim(im)                           GRB1F305.222    
           IF (MOD(SECS_PER_PERIOD,86400).NE.0) THEN                       GRB1F305.223    
             ICODE=620                                                     GRB1F305.224    
             CMESSAGE=                                                     GRB1F305.225    
     *'INITTIME: Internal model t/s period MUST BE whole no of days'       GRB1F305.226    
             WRITE(6,*)CMESSAGE                                            GIE0F403.329    
             WRITE(6,*)'Internal model id, period=',im,SECS_PER_PERIOD     GIE0F403.330    
             GOTO 999                                                      GRB1F305.229    
           ENDIF                                                           GRB1F305.230    
           ENDIF                                                           GRB1F305.231    
        ENDDO ! ii over N_INTERNAL_MODEL                                   GRB1F305.232    
*ENDIF Ocean or Slab or Wave                                               WRB1F401.547    
        DO I=1,6                                                           INITTIM1.101    
*IF DEF,ATMOS                                                              INITTIM1.102    
          MODEL_DATA_TIME(I)=A_FIXHD(20+I)                                 INITTIM1.103    
*ELSE                                                                      INITTIM1.104    
*IF DEF,OCEAN                                                              WRB1F401.548    
          MODEL_DATA_TIME(I)=O_FIXHD(20+I)                                 INITTIM1.105    
*ELSE                                                                      WRB1F401.549    
          MODEL_DATA_TIME(I)=W_FIXHD(20+I)                                 WRB1F401.550    
*ENDIF                                                                     INITTIM1.106    
*ENDIF                                                                     WRB1F401.551    
CL  Initialise run_resubmit_target to zero                                 INITTIM1.107    
          RUN_RESUBMIT_TARGET(I)=0                                         INITTIM1.108    
        ENDDO                                                              INITTIM1.109    
CL  Initialise run_resubmit_jobname to current jobname                     INITTIM1.110    
        RUN_RESUBMIT_JOBNAME = RUN_JOB_NAME                                INITTIM1.111    
CL----------------------------------------------------------------------   INITTIM1.112    
CL 1. Check MODEL_BASIS_TIME against dump validity time in header(s)       INITTIM1.113    
CL    (first step only - skipped if assimilation or pseudo-assimilation)   INITTIM1.114    
CL                                                                         INITTIM1.115    
        IF ( .NOT.                                                         INITTIM1.116    
     1    ((MODEL_ASSIM_MODE.EQ."Atmosphere".OR.                           INITTIM1.117    
     2      MODEL_ASSIM_MODE.EQ."Coupled   ") .AND.                        INITTIM1.118    
     3     (RUN_ASSIM_MODE.EQ."Atmosphere".OR.                             INITTIM1.119    
     4      RUN_ASSIM_MODE.EQ."Coupled   "))) THEN                         INITTIM1.120    
*IF DEF,ATMOS                                                              INITTIM1.121    
          L_DT_ERROR= .NOT.(MODEL_BASIS_TIME(1).EQ.A_FIXHD(28) .AND.       INITTIM1.122    
     1                      MODEL_BASIS_TIME(2).EQ.A_FIXHD(29) .AND.       INITTIM1.123    
     2                      MODEL_BASIS_TIME(3).EQ.A_FIXHD(30) .AND.       INITTIM1.124    
     3                      MODEL_BASIS_TIME(4).EQ.A_FIXHD(31) .AND.       INITTIM1.125    
     4                      MODEL_BASIS_TIME(5).EQ.A_FIXHD(32) .AND.       INITTIM1.126    
     5                      MODEL_BASIS_TIME(6).EQ.A_FIXHD(33))            INITTIM1.127    
          IF (L_DT_ERROR) THEN                                             INITTIM1.128    
            ICODE=1                                                        INITTIM1.129    
            CMESSAGE="INITTIME: Atmosphere basis time mismatch"            INITTIM1.130    
            GOTO 999                                                       INITTIM1.131    
          ENDIF                                                            INITTIM1.132    
*ENDIF                                                                     INITTIM1.133    
*IF DEF,OCEAN                                                              INITTIM1.134    
          L_DT_ERROR= .NOT.(MODEL_BASIS_TIME(1).EQ.O_FIXHD(28) .AND.       INITTIM1.135    
     1                      MODEL_BASIS_TIME(2).EQ.O_FIXHD(29) .AND.       INITTIM1.136    
     2                      MODEL_BASIS_TIME(3).EQ.O_FIXHD(30) .AND.       INITTIM1.137    
     3                      MODEL_BASIS_TIME(4).EQ.O_FIXHD(31) .AND.       INITTIM1.138    
     4                      MODEL_BASIS_TIME(5).EQ.O_FIXHD(32) .AND.       INITTIM1.139    
     5                      MODEL_BASIS_TIME(6).EQ.O_FIXHD(33))            INITTIM1.140    
          IF (L_DT_ERROR) THEN                                             INITTIM1.141    
            ICODE=2                                                        INITTIM1.142    
            CMESSAGE="INITTIME: Ocean basis time mismatch"                 INITTIM1.143    
            GOTO 999                                                       INITTIM1.144    
          ENDIF                                                            INITTIM1.145    
*ENDIF                                                                     INITTIM1.146    
*IF DEF,WAVE                                                               WRB1F401.552    
          L_DT_ERROR= .NOT.(MODEL_BASIS_TIME(1).EQ.W_FIXHD(28) .AND.       WRB1F401.553    
     1                      MODEL_BASIS_TIME(2).EQ.W_FIXHD(29) .AND.       WRB1F401.554    
     2                      MODEL_BASIS_TIME(3).EQ.W_FIXHD(30) .AND.       WRB1F401.555    
     3                      MODEL_BASIS_TIME(4).EQ.W_FIXHD(31) .AND.       WRB1F401.556    
     4                      MODEL_BASIS_TIME(5).EQ.W_FIXHD(32) .AND.       WRB1F401.557    
     5                      MODEL_BASIS_TIME(6).EQ.W_FIXHD(33))            WRB1F401.558    
          IF (L_DT_ERROR) THEN                                             WRB1F401.559    
            ICODE=2                                                        WRB1F401.560    
            CMESSAGE="INITTIME: Wave basis time mismatch"                  WRB1F401.561    
      WRITE(6,*)' model_basis_time ',model_basis_time                      GIE0F403.331    
      WRITE(6,*)' w_fixhd ',(w_fixhd(i),i=28,33)                           GIE0F403.332    
            GOTO 999                                                       WRB1F401.564    
        ENDIF                                                              INITTIM1.147    
*ENDIF                                                                     WRB1F401.565    
        ENDIF                                                              WRB1F401.566    
      ELSE IF (.not.NewRun .and. MODEL_BASIS_TIME(2).eq.0                  GRB1F400.30     
     &                     .and. MODEL_BASIS_TIME(3).eq.0 ) THEN           GRB1F400.31     
        A_STEPS_PER_HR = 3600*STEPS_PER_PERIODim(a_im)/                    GRB1F400.32     
     &                        SECS_PER_PERIODim(a_im)                      GRB1F400.33     
        IF (H_STEPim(a_im).ge.MODEL_ANALYSIS_HRS*A_STEPS_PER_HR) THEN      GRB1F400.34     
!  Convert model_data_time to days/secs                                    GRB1F400.35     
          CALL TIME2SEC(MODEL_DATA_TIME(1),MODEL_DATA_TIME(2),             GRB1F400.36     
     &                  MODEL_DATA_TIME(3),MODEL_DATA_TIME(4),             GRB1F400.37     
     &                  MODEL_DATA_TIME(5),MODEL_DATA_TIME(6),             GRB1F400.38     
     &              0,0,ELAPSED_DAYS,ELAPSED_SECS,LCAL360)                 GRB1F400.39     
          INCREMENT_DAYS = 0                                               GRB1F400.40     
          INCREMENT_SECS = -MODEL_ANALYSIS_HRS*3600                        GRB1F400.41     
!  Subtract model_analysis_hrs from model_data_time to recover             GRB1F400.42     
!  model_basis_time                                                        GRB1F400.43     
          CALL TIME_DF(ELAPSED_DAYS,ELAPSED_SECS,INCREMENT_DAYS,           GRB1F400.44     
     &                 INCREMENT_SECS,FINAL_DAYS,FINAL_SECS)               GRB1F400.45     
          CALL SEC2TIME(FINAL_DAYS,FINAL_SECS,0,0,                         GRB1F400.46     
     &                  MODEL_BASIS_TIME(1),MODEL_BASIS_TIME(2),           GRB1F400.47     
     &                  MODEL_BASIS_TIME(3),MODEL_BASIS_TIME(4),           GRB1F400.48     
     &                  MODEL_BASIS_TIME(5),MODEL_BASIS_TIME(6),           GRB1F400.49     
     &                  I_DAY_NUMBER,LCAL360)                              ARB2F403.158    
      WRITE(6,*)' INITTIME; analysis_hrs,incr_secs ',model_analysis_hrs,   GIE0F403.333    
     &                    increment_secs                                   GRB1F400.52     
        ELSE                                                               GRB1F400.53     
          do i = 1,6                                                       GRB1F400.54     
            MODEL_BASIS_TIME(i) = MODEL_DATA_TIME(i)                       GRB1F400.55     
          end do                                                           GRB1F400.56     
        END IF                                                             GRB1F400.57     
      WRITE(6,*)' INITTIME; model_data_time= ',model_data_time             GIE0F403.334    
      WRITE(6,*)' INITTIME; model_basis_time= ',model_basis_time           GIE0F403.335    
      ENDIF                                                                INITTIM1.148    
CL                                                                         INITTIM1.149    
CL 1.2 Check MODEL_DATA_TIME against dump data time in header(s)           INITTIM1.150    
CL                                                                         INITTIM1.151    
      IF (MODEL_STATUS.NE.'Operational   ') THEN                           INITTIM1.152    
*IF DEF,ATMOS                                                              INITTIM1.153    
        L_DT_ERROR= .NOT.(MODEL_DATA_TIME(1).EQ.A_FIXHD(21) .AND.          INITTIM1.154    
     1                    MODEL_DATA_TIME(2).EQ.A_FIXHD(22) .AND.          INITTIM1.155    
     2                    MODEL_DATA_TIME(3).EQ.A_FIXHD(23) .AND.          INITTIM1.156    
     3                    MODEL_DATA_TIME(4).EQ.A_FIXHD(24) .AND.          INITTIM1.157    
     4                    MODEL_DATA_TIME(5).EQ.A_FIXHD(25) .AND.          INITTIM1.158    
     5                    MODEL_DATA_TIME(6).EQ.A_FIXHD(26))               INITTIM1.159    
        IF (L_DT_ERROR) THEN                                               INITTIM1.160    
          ICODE=3                                                          INITTIM1.161    
          CMESSAGE="INITTIME: Atmosphere data time mismatch"               INITTIM1.162    
          GOTO 999                                                         INITTIM1.163    
        ENDIF                                                              INITTIM1.164    
*ENDIF                                                                     INITTIM1.165    
*IF DEF,OCEAN                                                              INITTIM1.166    
        L_DT_ERROR= .NOT.(MODEL_DATA_TIME(1).EQ.O_FIXHD(21) .AND.          INITTIM1.167    
     1                    MODEL_DATA_TIME(2).EQ.O_FIXHD(22) .AND.          INITTIM1.168    
     2                    MODEL_DATA_TIME(3).EQ.O_FIXHD(23) .AND.          INITTIM1.169    
     3                    MODEL_DATA_TIME(4).EQ.O_FIXHD(24) .AND.          INITTIM1.170    
     4                    MODEL_DATA_TIME(5).EQ.O_FIXHD(25) .AND.          INITTIM1.171    
     5                    MODEL_DATA_TIME(6).EQ.O_FIXHD(26))               INITTIM1.172    
        IF (L_DT_ERROR) THEN                                               INITTIM1.173    
          ICODE=4                                                          INITTIM1.174    
          CMESSAGE="INITTIME: Ocean data time mismatch"                    INITTIM1.175    
          GOTO 999                                                         INITTIM1.176    
        ENDIF                                                              INITTIM1.177    
*ENDIF                                                                     INITTIM1.178    
*IF DEF,WAVE                                                               WRB1F401.567    
        L_DT_ERROR= .NOT.(MODEL_DATA_TIME(1).EQ.W_FIXHD(21) .AND.          WRB1F401.568    
     1                    MODEL_DATA_TIME(2).EQ.W_FIXHD(22) .AND.          WRB1F401.569    
     2                    MODEL_DATA_TIME(3).EQ.W_FIXHD(23) .AND.          WRB1F401.570    
     3                    MODEL_DATA_TIME(4).EQ.W_FIXHD(24) .AND.          WRB1F401.571    
     4                    MODEL_DATA_TIME(5).EQ.W_FIXHD(25) .AND.          WRB1F401.572    
     5                    MODEL_DATA_TIME(6).EQ.W_FIXHD(26))               WRB1F401.573    
        IF (L_DT_ERROR) THEN                                               WRB1F401.574    
          ICODE=4                                                          WRB1F401.575    
          CMESSAGE="INITTIME: Wave data time mismatch"                     WRB1F401.576    
          GOTO 999                                                         WRB1F401.577    
      ENDIF                                                                INITTIM1.179    
*ENDIF                                                                     WRB1F401.578    
      ENDIF                                                                WRB1F401.579    
CL----------------------------------------------------------------------   INITTIM1.180    
CL 2. Check that model calendar matches the dump header(s)                 INITTIM1.181    
CL                                                                         INITTIM1.182    
      IF (LCAL360) THEN                                                    GSS1F304.424    
      ICAL=2                                                               INITTIM1.184    
      ELSE                                                                 GSS1F304.425    
      ICAL=1                                                               INITTIM1.186    
      END IF                                                               GSS1F304.426    
*IF DEF,ATMOS                                                              INITTIM1.188    
      IF (A_FIXHD(8).NE.ICAL) THEN                                         INITTIM1.189    
        ICODE=-1                                                           INITTIM1.190    
        CMESSAGE="INITTIME: Model calendar doesn't match atmos dump"       INITTIM1.191    
        WRITE(6,*)CMESSAGE                                                 GIE0F403.336    
        A_FIXHD(8)=ICAL                                                    INITTIM1.193    
      ENDIF                                                                INITTIM1.194    
*ENDIF                                                                     INITTIM1.195    
*IF DEF,OCEAN                                                              INITTIM1.196    
      IF (O_FIXHD(8).NE.ICAL) THEN                                         INITTIM1.197    
        ICODE=-2                                                           INITTIM1.198    
        CMESSAGE="INITTIME: Model calendar doesn't match ocean dump"       INITTIM1.199    
        WRITE(6,*)CMESSAGE                                                 GIE0F403.337    
        O_FIXHD(8)=ICAL                                                    INITTIM1.201    
      ENDIF                                                                INITTIM1.202    
*ENDIF                                                                     INITTIM1.203    
*IF DEF,WAVE                                                               WRB1F401.580    
      IF (W_FIXHD(8).NE.ICAL) THEN                                         WRB1F401.581    
        ICODE=-2                                                           WRB1F401.582    
        CMESSAGE="INITTIME: Model calendar doesn't match wave dump"        WRB1F401.583    
        WRITE(6,*)CMESSAGE                                                 GIE0F403.338    
        W_FIXHD(8)=ICAL                                                    WRB1F401.585    
      ENDIF                                                                WRB1F401.586    
*ENDIF                                                                     WRB1F401.587    
CL----------------------------------------------------------------------   INITTIM1.204    
CL 3. Initialise model time relative to zero point of calendar, using      INITTIM1.205    
CL    30 day month calendar for climate models, full calendar including    INITTIM1.206    
CL    leap years for other models                                          INITTIM1.207    
CL                                                                         INITTIM1.208    
      I_YEAR   = MODEL_BASIS_TIME(1)                                       INITTIM1.209    
      I_MONTH  = MODEL_BASIS_TIME(2)                                       INITTIM1.210    
      I_DAY    = MODEL_BASIS_TIME(3)                                       INITTIM1.211    
      I_HOUR   = MODEL_BASIS_TIME(4)                                       INITTIM1.212    
      I_MINUTE = MODEL_BASIS_TIME(5)                                       INITTIM1.213    
      I_SECOND = MODEL_BASIS_TIME(6)                                       INITTIM1.214    
C                                                                          INITTIM1.215    
      CALL TIME2SEC(I_YEAR,I_MONTH,I_DAY,I_HOUR,I_MINUTE,I_SECOND,         INITTIM1.216    
     1              0,0,BASIS_TIME_DAYS,BASIS_TIME_SECS,LCAL360)           GSS1F304.427    
CL                                                                         INITTIM1.218    
CL 3.1 Set initial time day number in dump header(s) only at start         INITTIM1.219    
CL                                                                         INITTIM1.220    
*IF DEF,ATMOS                                                              INITTIM1.221    
      IF(H_STEPim(atmos_im).EQ.0) THEN                                     GRB1F305.234    
         CALL SEC2TIME(0,0,BASIS_TIME_DAYS,BASIS_TIME_SECS,                TJ080294.121    
     &                 I_YEAR,I_MONTH,I_DAY,I_HOUR,                        TJ080294.122    
     1                 I_MINUTE,I_SECOND,I_DAY_NUMBER,LCAL360)             GSS1F304.428    
         A_FIXHD(27) = I_DAY_NUMBER                                        INITTIM1.225    
      ENDIF                                                                INITTIM1.226    
*ENDIF                                                                     INITTIM1.227    
*IF DEF,OCEAN                                                              INITTIM1.228    
      IF(H_STEPim(ocean_im).EQ.0) THEN                                     GRB1F305.235    
         CALL SEC2TIME(0,0,BASIS_TIME_DAYS,BASIS_TIME_SECS,                TJ080294.123    
     &                 I_YEAR,I_MONTH,I_DAY,I_HOUR,                        TJ080294.124    
     1                 I_MINUTE,I_SECOND,I_DAY_NUMBER,LCAL360)             GSS1F304.429    
         O_FIXHD(27) = I_DAY_NUMBER                                        INITTIM1.232    
      ENDIF                                                                INITTIM1.233    
*ENDIF                                                                     INITTIM1.234    
*IF DEF,WAVE                                                               WRB1F401.588    
      IF(H_STEPim(wave_im).EQ.0) THEN                                      WRB1F401.589    
         CALL SEC2TIME(0,0,BASIS_TIME_DAYS,BASIS_TIME_SECS,                WRB1F401.590    
     &                 I_YEAR,I_MONTH,I_DAY,I_HOUR,                        WRB1F401.591    
     1                 I_MINUTE,I_SECOND,I_DAY_NUMBER,LCAL360)             WRB1F401.592    
         W_FIXHD(27) = I_DAY_NUMBER                                        WRB1F401.593    
      ENDIF                                                                WRB1F401.594    
*ENDIF                                                                     WRB1F401.595    
C                                                                          INITTIM1.235    
CL----------------------------------------------------------------------   INITTIM1.236    
CL 4. If running in IAU mode, read in data time of IAU dump, and           VSB2F404.40     
CL    calculate number of hours from basis time to IAU data time           VSB2F404.41     
CL    (ie. MODEL_ANALYSIS_HRS).                                            VSB2F404.42     
CL                                                                         VSB2F404.43     
      IF (L_IAU) THEN                                                      VSB2F404.44     
                                                                           VSB2F404.45     
        IAU_UNIT=108                                                       VSB2F404.46     
        CALL FILE_OPEN (IAU_UNIT,'ANLINCR',7,0,0,ICODE)                    VSB2F404.47     
        IF (ICODE.NE.0) THEN                                               VSB2F404.48     
          CMESSAGE="INITTIME: Error opening IAU dump"                      VSB2F404.49     
          GOTO 999                                                         VSB2F404.50     
        ENDIF                                                              VSB2F404.51     
                                                                           VSB2F404.52     
        CALL READ_FLH  (IAU_UNIT,IAU_FIXHD,LEN_FIXHD,ICODE,CMESSAGE)       VSB2F404.53     
        IF (ICODE.NE.0) THEN                                               VSB2F404.54     
          CMESSAGE="INITTIME: Error reading header of IAU dump"            VSB2F404.55     
          GOTO 999                                                         VSB2F404.56     
        ENDIF                                                              VSB2F404.57     
                                                                           VSB2F404.58     
        CALL FILE_CLOSE(IAU_UNIT,'ANLINCR',7,0,0,ICODE)                    VSB2F404.59     
        IF (ICODE.NE.0) THEN                                               VSB2F404.60     
          CMESSAGE="INITTIME: Error closing IAU dump"                      VSB2F404.61     
          GOTO 999                                                         VSB2F404.62     
        ENDIF                                                              VSB2F404.63     
                                                                           VSB2F404.64     
        DO I=1,6                                                           VSB2F404.65     
          IAU_DATA_TIME(I)=IAU_FIXHD(20+I)                                 VSB2F404.66     
        ENDDO                                                              VSB2F404.67     
                                                                           VSB2F404.68     
        CALL TIME2SEC(IAU_DATA_TIME(1),IAU_DATA_TIME(2),                   VSB2F404.69     
     &                IAU_DATA_TIME(3),IAU_DATA_TIME(4),                   VSB2F404.70     
     &                IAU_DATA_TIME(5),IAU_DATA_TIME(6),                   VSB2F404.71     
     &                BASIS_TIME_DAYS,BASIS_TIME_SECS,                     VSB2F404.72     
     &                IAU_TIME_DAYS,IAU_TIME_SECS,LCAL360)                 VSB2F404.73     
                                                                           VSB2F404.74     
        MODEL_ANALYSIS_HRS=IAU_TIME_DAYS*24 + IAU_TIME_SECS/3600           VSB2F404.75     
                                                                           VSB2F404.76     
        IF (MODEL_ANALYSIS_HRS.LT.0) THEN                                  VSB2F404.77     
          ICODE=1                                                          VSB2F404.78     
          CMESSAGE="INITTIME: IAU data time before basis time"             VSB2F404.79     
          GOTO 999                                                         VSB2F404.80     
        ENDIF                                                              VSB2F404.81     
                                                                           VSB2F404.82     
        MODEL_ASSIM_MODE='Atmosphere'                                      VSB2F404.83     
                                                                           VSB2F404.84     
      ENDIF                                                                VSB2F404.85     
CL----------------------------------------------------------------------   VSB2F404.86     
CL 5. Initialise incremental step counter(s) to accord with basis time     VSB2F404.87     
CL    and model restart time, and flag any difference which might occur    INITTIM1.238    
CL    due to altering the timestep partway through an integration.         INITTIM1.239    
CL    Set steps-per-group to match timestep, and echo both step and        INITTIM1.240    
CL    steps-per-group information in the history file.                     INITTIM1.241    
CL                                                                         INITTIM1.242    
      DO ii=1,N_INTERNAL_MODEL                                             GRB1F305.236    
        im=INTERNAL_MODEL_LIST(ii)                                         GRB1F305.237    
        SECS_PER_PERIOD =SECS_PER_PERIODim(im)                             GRB1F305.238    
        STEPS_PER_PERIOD=STEPS_PER_PERIODim(im)                            GRB1F305.239    
        H_STEP   = H_STEPim(im)                                            GRB1F305.240    
*IF DEF,ATMOS                                                              INITTIM1.243    
        IF(im.EQ.atmos_im) THEN                                            GRB1F305.241    
          I_YEAR   = A_FIXHD(28)                                           GRB1F305.242    
          I_MONTH  = A_FIXHD(29)                                           GRB1F305.243    
          I_DAY    = A_FIXHD(30)                                           GRB1F305.244    
          I_HOUR   = A_FIXHD(31)                                           GRB1F305.245    
          I_MINUTE = A_FIXHD(32)                                           GRB1F305.246    
          I_SECOND = A_FIXHD(33)                                           GRB1F305.247    
        ENDIF   ! atmos_im                                                 GRB1F305.248    
*ENDIF    Atmos                                                            GRB1F305.249    
*IF DEF,SLAB                                                               INITTIM1.278    
        IF(im.EQ.slab_im) THEN                                             GRB1F305.250    
          I_YEAR   = A_FIXHD(28)                                           GRB1F305.251    
          I_MONTH  = A_FIXHD(29)                                           GRB1F305.252    
          I_DAY    = A_FIXHD(30)                                           GRB1F305.253    
          I_HOUR   = A_FIXHD(31)                                           GRB1F305.254    
          I_MINUTE = A_FIXHD(32)                                           GRB1F305.255    
          I_SECOND = A_FIXHD(33)                                           GRB1F305.256    
        ENDIF   ! slab_im                                                  GRB1F305.257    
*ENDIF    Slab                                                             GRB1F305.258    
*IF DEF,OCEAN                                                              INITTIM1.290    
        IF(im.EQ.ocean_im) THEN                                            GRB1F305.259    
          I_YEAR   = O_FIXHD(28)                                           GRB1F305.260    
          I_MONTH  = O_FIXHD(29)                                           GRB1F305.261    
          I_DAY    = O_FIXHD(30)                                           GRB1F305.262    
          I_HOUR   = O_FIXHD(31)                                           GRB1F305.263    
          I_MINUTE = O_FIXHD(32)                                           GRB1F305.264    
          I_SECOND = O_FIXHD(33)                                           GRB1F305.265    
        ENDIF   ! ocean_im                                                 GRB1F305.266    
*ENDIF    Ocean                                                            GRB1F305.267    
*IF DEF,WAVE                                                               WRB1F401.596    
        IF(im.EQ.wave_im) THEN                                             WRB1F401.597    
          I_YEAR   = W_FIXHD(28)                                           WRB1F401.598    
          I_MONTH  = W_FIXHD(29)                                           WRB1F401.599    
          I_DAY    = W_FIXHD(30)                                           WRB1F401.600    
          I_HOUR   = W_FIXHD(31)                                           WRB1F401.601    
          I_MINUTE = W_FIXHD(32)                                           WRB1F401.602    
          I_SECOND = W_FIXHD(33)                                           WRB1F401.603    
        ENDIF   ! wave_im                                                  WRB1F401.604    
*ENDIF    Wave                                                             WRB1F401.605    
C                                                                          INITTIM1.297    
      CALL TIME2SEC(I_YEAR,I_MONTH,I_DAY,I_HOUR,I_MINUTE,I_SECOND,         INITTIM1.298    
     1              BASIS_TIME_DAYS,BASIS_TIME_SECS,                       TJ080294.141    
     2              ELAPSED_DAYS,ELAPSED_SECS,LCAL360)                     GSS1F304.433    
C                                                                          INITTIM1.300    
      CALL TIME2SEC(MODEL_DATA_TIME(1),MODEL_DATA_TIME(2),                 INITTIM1.301    
     1              MODEL_DATA_TIME(3),MODEL_DATA_TIME(4),                 INITTIM1.302    
     2              MODEL_DATA_TIME(5),MODEL_DATA_TIME(6),                 INITTIM1.303    
     3              BASIS_TIME_DAYS,BASIS_TIME_SECS,                       TJ080294.143    
     4              DATA_MINUS_BASIS_DAYS,DATA_MINUS_BASIS_SECS,           GSS1F304.434    
     5              LCAL360)                                               GSS1F304.435    
C                                                                          INITTIM1.305    
      DATA_MINUS_BASIS_HRS= DATA_MINUS_BASIS_SECS/3600+                    TJ080294.145    
     &                      24*DATA_MINUS_BASIS_DAYS                       TJ080294.146    
C                                                                          TJ080294.147    
      FORECAST_HRS=       - DATA_MINUS_BASIS_HRS                           INITTIM1.307    
CL   DATA_MINUS_BASIS_HRS can only be gt 0 for CRUNs when an earlier       INITTIM1.308    
CL   run has had MODEL_DATA_TIME updated. For correct values of LBFT       INITTIM1.309    
CL   header in CRUNs reset to 0.                                           INITTIM1.310    
      IF(DATA_MINUS_BASIS_HRS.GT.0) DATA_MINUS_BASIS_HRS=0                 INITTIM1.311    
      FORECAST_HRS= ELAPSED_SECS/3600 + 24*ELAPSED_DAYS                    TJ080294.148    
     &            - DATA_MINUS_BASIS_HRS                                   TJ080294.149    
      IF (L_IAU) THEN                                                      VSB2F404.88     
        IF (FORECAST_HRS.GE.(MODEL_ANALYSIS_HRS-DATA_MINUS_BASIS_HRS))     VSB2F404.89     
     &    FORECAST_HRS=FORECAST_HRS-                                       VSB2F404.90     
     &                 (MODEL_ANALYSIS_HRS-DATA_MINUS_BASIS_HRS)           VSB2F404.91     
      ELSE                                                                 VSB2F404.92     
      IF (FORECAST_HRS.GE.MODEL_ANALYSIS_HRS)                              INITTIM1.313    
     &    FORECAST_HRS=FORECAST_HRS-MODEL_ANALYSIS_HRS                     INITTIM1.314    
      ENDIF                                                                VSB2F404.93     
C                                                                          INITTIM1.315    
      CALL TIM2STEP(ELAPSED_DAYS,ELAPSED_SECS,                             TJ080294.150    
     &              STEPS_PER_PERIOD,SECS_PER_PERIOD,STEP)                 GRB1F305.268    
      GROUP= (MODEL_HRS_PER_GROUP*3600*STEPS_PER_PERIOD)                   GRB1F305.269    
     &         /SECS_PER_PERIOD                                            GRB1F305.270    
      IF ((ELAPSED_DAYS.NE.0.OR.ELAPSED_SECS.NE.0).AND.                    GRB1F400.60     
     &    STEP.NE.H_STEP) THEN                                             GRB1F305.271    
        ICODE=-1                                                           INITTIM1.320    
        CMESSAGE="INITTIME: Warning- New STEP doesn't match old value"     GRB1F305.272    
        WRITE(6,*)CMESSAGE                                                 GIE0F403.339    
        WRITE(6,*)'Internal model id',im,' Old=',H_STEP,' New=',STEP       GIE0F403.340    
      ENDIF                                                                INITTIM1.323    
                                                                           GRB1F305.274    
      STEPim(im)    = STEP                                                 GRB1F305.275    
      GROUPim(im)   = GROUP                                                GRB1F305.276    
                                                                           GRB1F305.277    
      H_STEPim(im)    = STEP                                               GRB1F305.278    
      H_GROUPim(im)   = GROUP                                              GRB1F305.279    
      ENDDO ! ii over N_INTERNAL_MODEL                                     GRB1F305.280    
                                                                           GRB1F305.281    
CL----------------------------------------------------------------------   INITTIM1.327    
CL 6. Set target end steps from target end time using                      VSB2F404.94     
CL     relative time convention                                            INITTIM1.329    
CL                                                                         INITTIM1.330    
CL Overwrite history resubmit flag with user set switch.                   GRB3F400.6      
      RUN_RESUBMIT = CONTROL_RESUBMIT                                      GRB3F400.7      
      IF (RUN_RESUBMIT.eq."N") THEN                                        INITTIM1.331    
        I_YEAR   = RUN_TARGET_END(1)                                       INITTIM1.332    
        I_MONTH  = RUN_TARGET_END(2)                                       INITTIM1.333    
        I_DAY    = RUN_TARGET_END(3)                                       INITTIM1.334    
        I_HOUR   = RUN_TARGET_END(4)                                       INITTIM1.335    
        I_MINUTE = RUN_TARGET_END(5)                                       INITTIM1.336    
        I_SECOND = RUN_TARGET_END(6)                                       INITTIM1.337    
      IF (LCAL360) THEN                                                    GSS1F304.436    
        CALL TIME2SEC(I_YEAR,I_MONTH+1,I_DAY+1,I_HOUR,I_MINUTE,            INITTIM1.339    
     1                I_SECOND,0,0,ELAPSED_DAYS,ELAPSED_SECS,LCAL360)      GSS1F304.437    
      ELSE                                                                 GSS1F304.438    
        CALL TIME2SEC(I_YEAR+1,I_MONTH+1,I_DAY+1,I_HOUR,I_MINUTE,          INITTIM1.342    
     1                I_SECOND,0,0,ELAPSED_DAYS,ELAPSED_SECS,LCAL360)      GSS1F304.439    
      END IF                                                               GSS1F304.440    
      FINAL_DAYS=ELAPSED_DAYS                                              GSM1F401.32     
      FINAL_SECS=ELAPSED_SECS                                              GSM1F401.33     
      LAST_RUN_SECS=0                                                      GSM1F401.34     
      LAST_RUN_DAYS=0                                                      GSM1F401.35     
        RUN_RESUBMIT_JOBNAME = ' '                                         INITTIM1.345    
      ELSE                                                                 INITTIM1.346    
CL                                                                         INITTIM1.347    
CL work out next jobname and set present jobname                           INITTIM1.348    
CL                                                                         INITTIM1.349    
        RUN_JOB_NAME = RUN_RESUBMIT_JOBNAME                                INITTIM1.350    
        READ (RUN_JOB_NAME,2) CDUMMY,ICOUNT                                INITTIM1.351    
    2   FORMAT(A6,I2)                                                      INITTIM1.352    
    3   FORMAT(A6,A1,I1)                                                   INITTIM1.353    
        ICOUNT=MOD(ICOUNT+1,100)                                           INITTIM1.354    
        IF (ICOUNT.LT.10) THEN                                             INITTIM1.355    
          WRITE (RUN_RESUBMIT_JOBNAME,3) CDUMMY,'0',ICOUNT                 INITTIM1.356    
        ELSE                                                               INITTIM1.357    
          WRITE (RUN_RESUBMIT_JOBNAME,2) CDUMMY,ICOUNT                     INITTIM1.358    
        ENDIF                                                              INITTIM1.359    
CL                                                                         INITTIM1.360    
CL  Work out last target date in seconds                                   INITTIM1.361    
CL                                                                         INITTIM1.362    
        I_YEAR   = RUN_RESUBMIT_TARGET(1)                                  INITTIM1.363    
        I_MONTH  = RUN_RESUBMIT_TARGET(2)                                  INITTIM1.364    
        I_DAY    = RUN_RESUBMIT_TARGET(3)                                  INITTIM1.365    
        I_HOUR   = RUN_RESUBMIT_TARGET(4)                                  INITTIM1.366    
        I_MINUTE = RUN_RESUBMIT_TARGET(5)                                  INITTIM1.367    
        I_SECOND = RUN_RESUBMIT_TARGET(6)                                  INITTIM1.368    
      IF (LCAL360) THEN                                                    GSS1F304.441    
        CALL TIME2SEC(I_YEAR,I_MONTH+1,I_DAY+1,I_HOUR,I_MINUTE,            INITTIM1.370    
     1                I_SECOND,0,0,LAST_RUN_DAYS,LAST_RUN_SECS,LCAL360)    GSS1F304.442    
      ELSE                                                                 GSS1F304.443    
        CALL TIME2SEC(I_YEAR+1,I_MONTH+1,I_DAY+1,I_HOUR,I_MINUTE,          INITTIM1.373    
     1                I_SECOND,0,0,LAST_RUN_DAYS,LAST_RUN_SECS,LCAL360)    GSS1F304.444    
      END IF                                                               GSS1F304.445    
CL                                                                         INITTIM1.376    
CL  Work out increment in target date required                             INITTIM1.377    
CL                                                                         INITTIM1.378    
        I_YEAR   = RUN_RESUBMIT_INC(1)                                     INITTIM1.379    
        I_MONTH  = RUN_RESUBMIT_INC(2)                                     INITTIM1.380    
        I_DAY    = RUN_RESUBMIT_INC(3)                                     INITTIM1.381    
        I_HOUR   = RUN_RESUBMIT_INC(4)                                     INITTIM1.382    
        I_MINUTE = RUN_RESUBMIT_INC(5)                                     INITTIM1.383    
        I_SECOND = RUN_RESUBMIT_INC(6)                                     INITTIM1.384    
      IF (LCAL360) THEN                                                    GSS1F304.446    
        CALL TIME2SEC(I_YEAR,I_MONTH+1,I_DAY+1,I_HOUR,I_MINUTE,            INITTIM1.386    
     1                I_SECOND,0,0,INCREMENT_DAYS,INCREMENT_SECS,          GSS1F304.447    
     2                LCAL360)                                             GSS1F304.448    
      ELSE                                                                 GSS1F304.449    
        CALL TIME2SEC(I_YEAR+1,I_MONTH+1,I_DAY+1,I_HOUR,I_MINUTE,          INITTIM1.389    
     1                I_SECOND,0,0,INCREMENT_DAYS,INCREMENT_SECS,          GSS1F304.450    
     2                LCAL360)                                             GSS1F304.451    
      END IF                                                               GSS1F304.452    
CL                                                                         INITTIM1.392    
CL  Work out final target date required  in days/seconds                   TJ080294.160    
CL                                                                         INITTIM1.394    
        I_YEAR   = RUN_TARGET_END(1)                                       INITTIM1.395    
        I_MONTH  = RUN_TARGET_END(2)                                       INITTIM1.396    
        I_DAY    = RUN_TARGET_END(3)                                       INITTIM1.397    
        I_HOUR   = RUN_TARGET_END(4)                                       INITTIM1.398    
        I_MINUTE = RUN_TARGET_END(5)                                       INITTIM1.399    
        I_SECOND = RUN_TARGET_END(6)                                       INITTIM1.400    
      IF (LCAL360) THEN                                                    GSS1F304.453    
        CALL TIME2SEC(I_YEAR,I_MONTH+1,I_DAY+1,I_HOUR,I_MINUTE,            INITTIM1.402    
     1                I_SECOND,0,0,FINAL_DAYS,FINAL_SECS,LCAL360)          GSS1F304.454    
      ELSE                                                                 GSS1F304.455    
        CALL TIME2SEC(I_YEAR+1,I_MONTH+1,I_DAY+1,I_HOUR,I_MINUTE,          INITTIM1.405    
     1                I_SECOND,0,0,FINAL_DAYS,FINAL_SECS,LCAL360)          GSS1F304.456    
      END IF                                                               GSS1F304.457    
CL                                                                         INITTIM1.408    
CL  target for this job                                                    INITTIM1.409    
CL                                                                         INITTIM1.410    
        ELAPSED_DAYS=LAST_RUN_DAYS+INCREMENT_DAYS                          TJ080294.163    
        ELAPSED_SECS=LAST_RUN_SECS+INCREMENT_SECS                          INITTIM1.411    
        IF (ELAPSED_SECS.GT.86400) THEN                                    TJ080294.164    
          ELAPSED_SECS=ELAPSED_SECS-86400                                  TJ080294.165    
          ELAPSED_DAYS=ELAPSED_DAYS+1                                      TJ080294.166    
        ENDIF                                                              TJ080294.167    
        IF ((ELAPSED_DAYS.GT.FINAL_DAYS).OR.                               TJ080294.168    
     &  ((ELAPSED_DAYS.EQ.FINAL_DAYS).AND.(ELAPSED_SECS.GT.FINAL_SECS)))   TJ080294.169    
     &  THEN                                                               TJ080294.170    
          ELAPSED_DAYS = FINAL_DAYS                                        TJ080294.171    
          ELAPSED_SECS = FINAL_SECS                                        INITTIM1.413    
        ENDIF                                                              INITTIM1.414    
                                                                           INITTIM1.415    
      ENDIF                                                                INITTIM1.416    
      IF (ELAPSED_DAYS.LT.0) THEN                                          TJ080294.172    
        ICODE=1                                                            INITTIM1.418    
        CMESSAGE="INITTIME: Negative run length requested"                 INITTIM1.419    
        GOTO 999                                                           INITTIM1.420    
      ENDIF                                                                INITTIM1.421    
C                                                                          INITTIM1.422    
      DO ii=1,N_INTERNAL_MODEL                                             GRB1F305.282    
        im=INTERNAL_MODEL_LIST(ii)                                         GRB1F305.283    
        SECS_PER_PERIOD =SECS_PER_PERIODim(im)                             GRB1F305.284    
        STEPS_PER_PERIOD=STEPS_PER_PERIODim(im)                            GRB1F305.285    
        CALL TIM2STEP(ELAPSED_DAYS,ELAPSED_SECS,                           GRB1F305.286    
     *           STEPS_PER_PERIOD,SECS_PER_PERIOD,TARGET_END_STEP)         GRB1F305.287    
        TARGET_END_STEPim(im)=TARGET_END_STEP                              GRB1F305.288    
        IF(RUN_RESUBMIT.eq."Y") THEN                                       GGH1F401.3      
!L                                                                         GGH1F401.4      
!L Change TARGET_END_STEPim for CRUNs, to make sure it coincides           GGH1F401.5      
!L with period 1 mean times, if this is not the final job.                 GGH1F401.6      
!L                                                                         GGH1F401.7      
!L The tests check that 1) This is not the final job in the run.           GGH1F401.8      
!L 2) Meaning has been requested. 3) The length of the job is              GGH1F401.9      
!L greater than the meaning period.                                        GGH1F401.10     
!L                                                                         GGH1F401.11     
        IF(((TARGET_END_STEP*SECS_PER_PERIOD)/STEPS_PER_PERIOD .LT.        GGH1F401.12     
     &  (FINAL_SECS+(FINAL_DAYS*24*3600))) .AND.                           GGH1F401.13     
     &  (MEANFREQim(1,im) .NE. 0) .AND.                                    GGH1F401.14     
     &  ((TARGET_END_STEP*SECS_PER_PERIOD)/STEPS_PER_PERIOD -              GGH1F401.15     
     &  (LAST_RUN_SECS+(LAST_RUN_DAYS*24*3600)) .GT.                       GGH1F401.16     
     &  (MEANFREQim(1,im)*DUMPFREQim(im)*SECS_PER_PERIOD)                  GGH1F401.17     
     &  /STEPS_PER_PERIOD)) THEN                                           GGH1F401.18     
          WRITE(6,*)'INITTIM: Modifying TARGET_END_STEP from ',            GSM2F405.16     
     & TARGET_END_STEPim(im)                                               GSM2F405.17     
      IF (TARGET_END_STEP .GE. (OFFSET_DUMPSim(im) *                       GJC0F405.26     
     &                              DUMPFREQim(im))) THEN                  GGH1F401.20     
            TARGET_END_STEPim(im) = TARGET_END_STEP -                      GGH1F401.21     
     &      MOD(TARGET_END_STEP - (OFFSET_DUMPSim(im)*DUMPFREQim(im)),     GGH1F401.22     
     &      (MEANFREQim(1,im) * DUMPFREQim(im)))                           GGH1F401.23     
          ELSE                                                             GGH1F401.24     
      TARGET_END_STEPim(im) = TARGET_END_STEP -                            GJC0F405.27     
     &      MOD(TARGET_END_STEP - (OFFSET_DUMPSim(im)*DUMPFREQim(im)),     GGH1F401.26     
     &      (MEANFREQim(1,im) * DUMPFREQim(im)))                           GSM2F405.18     
      IF (TARGET_END_STEPim(im).GT.TARGET_END_STEP) THEN                   GSM2F405.19     
        TARGET_END_STEPim(im)=                                             GSM2F405.20     
     & TARGET_END_STEPim(im)-(MEANFREQim(1,im) * DUMPFREQim(im))           GSM2F405.21     
      ENDIF                                                                GSM2F405.22     
      ENDIF                                                                GSM2F405.23     
          WRITE(6,*)'Modified to ',TARGET_END_STEPim(im)                   GSM2F405.24     
! If this is a coupled atmosphere-slab run, the TARGET_END_STEP            GGH1F401.30     
! needs to be set correctly for the slab part of the run.                  GGH1F401.31     
*IF DEF,SLAB                                                               GGH1F401.32     
      TARGET_END_STEPim(S_IM)=                                             GJC0F405.28     
     &    (TARGET_END_STEPim(A_IM)*STEPS_PER_PERIODim(S_IM)                GGH1F401.34     
     &    *SECS_PER_PERIODim(A_IM))                                        GGH1F401.35     
     &    /(STEPS_PER_PERIODim(A_IM)*SECS_PER_PERIODim(S_IM))              GGH1F401.36     
*ENDIF                                                                     GGH1F401.37     
        ENDIF                                                              GGH1F401.38     
        ENDIF                                                              GGH1F401.39     
      ENDDO ! ii over N_INTERNAL_MODEL                                     GRB1F305.289    
CL----------------------------------------------------------------------   INITTIM1.430    
CL 7. Set assimilation start timestep, length in steps, and overlap into   VSB2F404.95     
CL     forecast from basic control information                             INITTIM1.432    
CL                                                                         INITTIM1.433    
*IF DEF,ATMOS                                                              INITTIM1.434    
      A_STEPS_PER_HR = 3600*STEPS_PER_PERIODim(a_im)/                      GRB1F305.290    
     &                       SECS_PER_PERIODim(a_im)                       GRB1F305.291    
      ASSIM_FIRSTSTEPim(a_im)  = A_ASSIM_START_HR*A_STEPS_PER_HR           GDR5F305.81     
      ASSIM_STEPSim(a_im)      = MODEL_ANALYSIS_HRS * A_STEPS_PER_HR -     GDR5F305.82     
     &                           ASSIM_FIRSTSTEPim(a_im)                   GDR5F305.83     
      ASSIM_EXTRASTEPSim(a_im) = (A_ASSIM_END_HR-MODEL_ANALYSIS_HRS)       GDR5F305.84     
     &                     *A_STEPS_PER_HR                                 INITTIM1.439    
*ENDIF                                                                     INITTIM1.440    
*IF DEF,OCNASSM                                                            INITTIM1.441    
      IF(MODEL_STATUS .EQ. 'Operational') THEN                             ORW0F404.5      
        ASSIM_FIRSTSTEPim(o_im) =                                          ORW0F404.6      
     &   O_ASSIM_START_HR*3600*STEPS_PER_PERIODim(o_im)/                   ORW0F404.7      
     &                         SECS_PER_PERIODim(o_im)                     ORW0F404.8      
      ELSE                                                                 ORW0F404.9      
        ASSIM_FIRSTSTEPim(o_im) = STEPim(o_im) +                           ORW0F404.10     
     &   O_ASSIM_START_HR*3600*STEPS_PER_PERIODim(o_im)/                   ORW0F404.11     
     &                         SECS_PER_PERIODim(o_im)                     ORW0F404.12     
      ENDIF                                                                ORW0F404.13     
      ASSIM_STEPSim(o_im) = (MODEL_ANALYSIS_HRS - O_ASSIM_START_HR) *      GDR5F305.86     
     &    3600*STEPS_PER_PERIODim(o_im)/SECS_PER_PERIODim(o_im)            GRB1F305.294    
      ASSIM_EXTRASTEPSim(o_im) = (O_ASSIM_END_HR-MODEL_ANALYSIS_HRS)*      GDR5F305.87     
     &    3600*STEPS_PER_PERIODim(o_im)/SECS_PER_PERIODim(o_im)            GRB1F305.295    
C                                                                          INITTIM1.448    
      O_CLM_FIRSTSTEP = O_CLM_START_HR *                                   INITTIM1.449    
     &    3600*STEPS_PER_PERIODim(o_im)/SECS_PER_PERIODim(o_im)            GRB1F305.296    
      O_CLM_LASTSTEP = O_CLM_END_HR *                                      INITTIM1.451    
     &    3600*STEPS_PER_PERIODim(o_im)/SECS_PER_PERIODim(o_im)            GRB1F305.297    
*ENDIF OCNASSM                                                             INITTIM1.453    
*IF DEF,WAVE                                                               WRB1F401.606    
      WRITE(6,*)'INITTIME: will need code for Wave Assimilation control'   GIE0F403.341    
*ENDIF                                                                     WRB1F401.608    
CL----------------------------------------------------------------------   INITTIM1.454    
CL 8. Set interface start/end and frequency in steps from hours            VSB2F404.96     
CL    This step is now done in deck INTFCTL                                GMB1F405.321    
CL----------------------------------------------------------------------   INITTIM1.470    
CL 9. Calculate length of timestep in seconds in CTIME                     VSB2F404.97     
CL                                                                         INITTIM1.473    
*IF DEF,ATMOS                                                              INITTIM1.474    
        SECS_PER_STEPim(atmos_sm) = FLOAT(SECS_PER_PERIODim(atmos_sm))/    GRB1F305.309    
     &                              FLOAT(STEPS_PER_PERIODim(atmos_sm))    GRB1F305.310    
*ENDIF                                                                     INITTIM1.476    
*IF DEF,OCEAN                                                              INITTIM1.477    
        SECS_PER_STEPim(ocean_sm) = FLOAT(SECS_PER_PERIODim(ocean_sm))/    GRB1F305.313    
     &                              FLOAT(STEPS_PER_PERIODim(ocean_sm))    GRB1F305.314    
*ENDIF                                                                     INITTIM1.479    
*IF DEF,WAVE                                                               WRB1F401.609    
        SECS_PER_STEPim(wave_sm) = FLOAT(SECS_PER_PERIODim(wave_sm))/      WRB1F401.610    
     &                             FLOAT(STEPS_PER_PERIODim(wave_sm))      WRB1F401.611    
*ENDIF                                                                     WRB1F401.612    
CL----------------------------------------------------------------------   INITTIM1.480    
CL 10. Set current time in CTIME according to submodel                     VSB2F404.98     
CL                                                                         INITTIM1.482    
*IF DEF,ATMOS                                                              INITTIM1.483    
      IF (submodel.EQ.atmos_sm) THEN                                       GRB1F305.317    
        I_YEAR   = A_FIXHD(28)                                             INITTIM1.485    
        I_MONTH  = A_FIXHD(29)                                             INITTIM1.486    
        I_DAY    = A_FIXHD(30)                                             INITTIM1.487    
        I_HOUR   = A_FIXHD(31)                                             INITTIM1.488    
        I_MINUTE = A_FIXHD(32)                                             INITTIM1.489    
        I_SECOND = A_FIXHD(33)                                             INITTIM1.490    
      ENDIF                                                                INITTIM1.491    
*ENDIF                                                                     INITTIM1.492    
*IF DEF,OCEAN                                                              INITTIM1.493    
      IF (submodel.EQ.ocean_sm) THEN                                       GRB1F305.318    
        I_YEAR   = O_FIXHD(28)                                             INITTIM1.495    
      I_MONTH  = O_FIXHD(29)                                               INITTIM1.496    
        I_DAY    = O_FIXHD(30)                                             INITTIM1.497    
        I_HOUR   = O_FIXHD(31)                                             INITTIM1.498    
        I_MINUTE = O_FIXHD(32)                                             INITTIM1.499    
        I_SECOND = O_FIXHD(33)                                             INITTIM1.500    
      ENDIF                                                                WRB1F401.613    
*ENDIF                                                                     WRB1F401.614    
*IF DEF,WAVE                                                               WRB1F401.615    
      IF (submodel.EQ.wave_sm) THEN                                        WRB1F401.616    
        I_YEAR   = W_FIXHD(28)                                             WRB1F401.617    
        I_MONTH  = W_FIXHD(29)                                             WRB1F401.618    
        I_DAY    = W_FIXHD(30)                                             WRB1F401.619    
        I_HOUR   = W_FIXHD(31)                                             WRB1F401.620    
        I_MINUTE = W_FIXHD(32)                                             WRB1F401.621    
        I_SECOND = W_FIXHD(33)                                             WRB1F401.622    
      ENDIF                                                                INITTIM1.501    
*ENDIF                                                                     INITTIM1.502    
      PREVIOUS_TIME(1)=I_YEAR                                              INITTIM1.503    
      PREVIOUS_TIME(2)=I_MONTH                                             INITTIM1.504    
      PREVIOUS_TIME(3)=I_DAY                                               INITTIM1.505    
      PREVIOUS_TIME(4)=I_HOUR                                              INITTIM1.506    
      PREVIOUS_TIME(5)=I_MINUTE                                            INITTIM1.507    
      PREVIOUS_TIME(6)=I_SECOND                                            INITTIM1.508    
      PREVIOUS_TIME(7)=0        ! Not yet set                              INITTIM1.509    
C                                                                          INITTIM1.510    
 999  CONTINUE                                                             INITTIM1.511    
      RETURN                                                               INITTIM1.512    
CL----------------------------------------------------------------------   INITTIM1.513    
      END                                                                  INITTIM1.514    
*ENDIF                                                                     INITTIM1.515