*IF DEF,CONTROL,AND,DEF,OCEAN                                              GSH1F403.18     
C ******************************COPYRIGHT******************************    GTS2F400.7021   
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved.    GTS2F400.7022   
C                                                                          GTS2F400.7023   
C Use, duplication or disclosure of this code is subject to the            GTS2F400.7024   
C restrictions as set forth in the contract.                               GTS2F400.7025   
C                                                                          GTS2F400.7026   
C                Meteorological Office                                     GTS2F400.7027   
C                London Road                                               GTS2F400.7028   
C                BRACKNELL                                                 GTS2F400.7029   
C                Berkshire UK                                              GTS2F400.7030   
C                RG12 2SZ                                                  GTS2F400.7031   
C                                                                          GTS2F400.7032   
C If no contract has been raised with this copy of the code, the use,      GTS2F400.7033   
C duplication or disclosure of it is strictly prohibited.  Permission      GTS2F400.7034   
C to do so must first be obtained in writing from the Head of Numerical    GTS2F400.7035   
C Modelling at the above address.                                          GTS2F400.7036   
C ******************************COPYRIGHT******************************    GTS2F400.7037   
C                                                                          GTS2F400.7038   
*IF DEF,OCEAN                                                              OCNSTEP1.3      
CLL  Routine: OCN_STEP                                                     OCNSTEP1.4      
CLL                                                                        OCNSTEP1.5      
CLL  Purpose: This subroutine is the top level control for                 OCNSTEP1.6      
CLL           an ocean forward time step and analysis step.                OCNSTEP1.7      
CLL           It is called from program U_MODEL.                           OCNSTEP1.8      
CLL                                                                        OCNSTEP1.9      
CLL  Tested under compiler: VAX Fortran 5.4   CRAY: cf77                   OCNSTEP1.10     
CLL  Tested under operating systems: VAX/VMS V5.3   CRAY: Unicos 5.0       OCNSTEP1.11     
CLL                                                                        OCNSTEP1.12     
CLL  Author: M. J. Bell   Date: 27 June 1992                               OCNSTEP1.13     
CLL                                                                        OCNSTEP1.14     
CLL  Model            Modification history from model version 3.0:         OCNSTEP1.15     
CLL version  date                                                          OCNSTEP1.16     
CLL   3.1  22/01/93  Add debugging code under *DEF BITCOM20 to assist      TJ270193.102    
CLL                  bit compare tests across new releases of the model.   TJ270193.103    
CLL  3.1   8/02/93 : added comdeck CHSUNITS to define NUNITS for           RS030293.215    
CLL                  comdeck CCONTROL.                                     RS030293.216    
CLL  3.2  Argument lists amended for dynamic allocation                    @DYALLOC.2791   
CLL  3.2   16/07/93  *CALL CSMID added under *DEF BITCOM.                  @DYALLOC.2792   
CLL  3.4   09/06/94  DEF BITCOM20 replaced by LOGICAL L_WRIT_OCNSTEP       GSS1F304.77     
CLL                  DEF BITCOM removed                                    GSS1F304.78     
CLL                  Comdeck C_WRITD *CALLed                               GSS1F304.79     
CLL                                              S.J.Swarbrick             GSS1F304.80     
CLL  3.5  07/06/95  Chgs to STASH_MAXLEN array.  RTHBarnes                 GRB4F305.335    
CLL  4.3      17/04/97     Tidy DEFS and code so that blank source is no   GSH1F403.19     
CLL                        produced (A. Brady)                             GSH1F403.20     
!LL  4.3  14/04/97  Change WRITD1 to DUMPCTL1 calls for MPP. K Rogers      GKR4F403.315    
CLL  4.4  Include ARGOINDX in call to OC_AC_CTL                            OFR1F404.1      
!    4.5  Remove ARGPTRA, ARGCONA in calls to OCN_FOR_STEP and             ORH3F405.72     
!         OC_AC_CTL                                                        ORH3F405.73     
CLL                                                                        OCNSTEP1.17     
CLL  External documentation: FOAM doc paper  5/2/1/1                       OCNSTEP1.18     
CLL                                                                        OCNSTEP1.19     
CLL  Logical components covered: top level for ocean assimilation          OCNSTEP1.20     
CLL                                                                        OCNSTEP1.21     
CLL  Programming standard: FOAM Doc Paper 3/2/1 version 1.0                OCNSTEP1.22     
CLL                                                                        OCNSTEP1.23     
C----------------------------------------------------------------------    OCNSTEP1.24     
C*L                                                                        OCNSTEP1.25     

      SUBROUTINE OCN_STEP(                                                  1,3@DYALLOC.2794   
*CALL ARGSIZE                                                              @DYALLOC.2795   
*CALL ARGDUMA                                                              @DYALLOC.2796   
*CALL ARGDUMO                                                              @DYALLOC.2797   
*CALL ARGDUMW                                                              GKR1F401.244    
*CALL ARGD1                                                                @DYALLOC.2798   
*CALL ARGPTRA                                                              @DYALLOC.2799   
*CALL ARGPTRO                                                              @DYALLOC.2800   
*CALL ARGSTS                                                               @DYALLOC.2801   
*CALL ARGCONA                                                              @DYALLOC.2802   
*CALL ARGCONO                                                              @DYALLOC.2803   
*CALL ARGBND                                                               SI180893.24     
*CALL ARGPPX                                                               GKR0F305.970    
     *                    ICODE,CMESSAGE)                                  @DYALLOC.2804   
C*                                                                         OCNSTEP1.27     
      IMPLICIT NONE                                                        OCNSTEP1.28     
C                                                                          GSS1F304.81     
C*L  ARGUMENT LIST                                                         OCNSTEP1.30     
C                                                                          GSS1F304.82     
      INTEGER ICODE            ! OUT return code                           OCNSTEP1.32     
      CHARACTER*256 CMESSAGE   ! OUT message accompanying return code      OCNSTEP1.33     
C*                                                                         OCNSTEP1.34     
*CALL OARRYSIZ                                                             ORH6F401.14     
*CALL COMOCASZ                                                             @DYALLOC.2805   
*CALL CSUBMODL                                                             GDR3F305.146    
*CALL CMAXSIZE                                                             @DYALLOC.2806   
*CALL TYPSIZE                                                              @DYALLOC.2807   
*CALL TYPDUMA                                                              @DYALLOC.2808   
*CALL TYPDUMO                                                              @DYALLOC.2809   
*CALL TYPDUMW                                                              GKR1F401.245    
*CALL TYPD1                                                                @DYALLOC.2810   
*CALL TYPPTRA                                                              @DYALLOC.2811   
*CALL TYPPTRO                                                              @DYALLOC.2812   
*CALL TYPSTS                                                               @DYALLOC.2813   
*CALL TYPCONA                                                              @DYALLOC.2814   
*CALL TYPCONO                                                              @DYALLOC.2815   
*CALL TYPBND                                                               SI180893.25     
*CALL TYPOCDPT                                                             @DYALLOC.2816   
*CALL PPXLOOK                                                              GKR0F305.971    
C                                                                          TJ270193.105    
CL When DEF,OCNASSM is False, this routine only calls OCN_FOR_STEP         OCNSTEP1.35     
C                                                                          OCNSTEP1.38     
C     COMDECKS                                                             OCNSTEP1.39     
C                                                                          OCNSTEP1.40     
*CALL CHSUNITS  ! defines NUNITS                                           RS030293.217    
*CALL CCONTROL  ! stores logicals for top level control                    OCNSTEP1.41     
*CALL CTIME     ! Needed for STEPim for time-step control of WRITD1        GDR5F305.131    
*CALL C_WRITD   ! Declares variables for time-step control of WRITD1       GSS1F304.85     
*CALL COCNINDX  ! Indices used by ocean to control row-wise loops          ORH7F402.68     
C                                                                          OCNSTEP1.48     
C   PARAMETERS                                                             OCNSTEP1.49     
      INTEGER NO_STSH_OA     ! STASH section number for ocean analysis     OCNSTEP1.50     
      PARAMETER ( NO_STSH_OA = 35 )                                        OCNSTEP1.51     
C                                                                          OCNSTEP1.52     
C   WORK ARRAYS                                                            OCNSTEP1.53     
C                                                                          OCNSTEP1.54     
      REAL DU_ASS_BTRP(IMT_ASM,JMT_ASM) ! barotrpic current increments     ORH1F305.5416   
     &,    DV_ASS_BTRP(IMT_ASM,JMT_ASM) ! calc'd in data analysis step     ORH1F305.5417   
C                                                                          OCNSTEP1.57     
      LOGICAL LL_ASS_BTRP         ! T => barotropic current incs made      OCNSTEP1.58     
C                                                                          OCNSTEP1.59     
C Local Storage                                                            GRB4F305.336    
      INTEGER IM_IDENT      ! internal model identifier                    GRB4F305.337    
     &       ,IM_INDEX      ! internal model index for STASH arrays        GRB4F305.338    
C                                                                          OCNSTEP1.61     
C EXTERNAL SUBROUTINES CALLED                                              OCNSTEP1.62     
C                                                                          OCNSTEP1.63     
      EXTERNAL OCN_FOR_STEP                                                OCNSTEP1.64     
     &,        OC_AC_CTL                                                   ORH1F305.5418   
     &,        OA_ZERO                                                     ORH1F305.5419   
     &,        TIMER                                                       ORH1F305.5420   
     &,        DUMPCTL                                                     GKR4F403.316    
                                                                           GRB4F305.339    
C  Set up internal model identifier and STASH index                        GRB4F305.340    
      im_ident = ocean_im                                                  GRB4F305.341    
      im_index = internal_model_index(im_ident)                            GRB4F305.342    
                                                                           GRB4F305.343    
C                                                                          GSS1F304.87     
C  Calc WRITD1_TEST - for time step control of WRITD1                      GSS1F304.88     
C                                                                          GSS1F304.89     
      IF (L_WRIT_OCNSTEP) THEN                                             GSS1F304.90     
                                                                           GSS1F304.91     
        IF (STEPim(o_im) .EQ. 1) THEN                                      GDR5F305.132    
        WRITD1_TEST_PREV = 0                                               GSS1F304.93     
        END IF                                                             GSS1F304.94     
                                                                           GSS1F304.95     
        WRITD1_TEST = (STEPim(o_im) - T_WRITD1_START)/T_WRITD1_INT         GDR5F305.133    
                                                                           GSS1F304.97     
        IF (STEPim(o_im) .LT. T_WRITD1_START) WRITD1_TEST = 0              GDR5F305.134    
                                                                           GSS1F304.99     
      END IF                                                               GSS1F304.100    
C                                                                          OCNSTEP1.65     
      IF (L_OCNASSM) THEN                                                  ORH1F305.5421   
C*                                                                         OCNSTEP1.70     
C-----------------------------------------------------------------------   OCNSTEP1.71     
                                                                           GSS1F304.101    
CL 0.1 Set barotropic current increments to zero                           OCNSTEP1.77     
C                                                                          OCNSTEP1.78     
      CALL OA_ZERO (IMT*JMT, DU_ASS_BTRP)                                  OCNSTEP1.79     
      CALL OA_ZERO (IMT*JMT, DV_ASS_BTRP)                                  OCNSTEP1.80     
C                                                                          OCNSTEP1.81     
CL 1. If climate increments to be made then CALL OC_CLM_INC                OCNSTEP1.82     
C                                                                          OCNSTEP1.83     
      IF (LAS_CLM_INC) THEN                                                OCNSTEP1.84     
CCC      CALL OC_CLM_INC(ICODE,CMESSAGE, IMT, JMT,                         OCNSTEP1.85     
CCC   #       LL_ASS_BTRP, DU_ASS_BTRP, DV_ASS_BTRP)                       OCNSTEP1.86     
        IF (ICODE .GT. 0) GO TO 999                                        OCNSTEP1.87     
      END IF                                                               OCNSTEP1.88     
C                                                                          OCNSTEP1.89     
CL 2. If inside assimilation period then CALL OC_AC_CTL                    OCNSTEP1.90     
C                                                                          OCNSTEP1.91     
      IF (LASSIMILATION) THEN                                              OCNSTEP1.92     
        CALL OC_AC_CTL(ICODE, CMESSAGE,                                    @DYALLOC.2820   
*CALL ARGSIZE                                                              @DYALLOC.2821   
*CALL ARGDUMA                                                              @DYALLOC.2822   
*CALL ARGDUMO                                                              @DYALLOC.2823   
*CALL ARGDUMW                                                              GKR1F401.246    
*CALL ARGD1                                                                @DYALLOC.2824   
*CALL ARGSTS                                                               @DYALLOC.2825   
*CALL ARGPTRO                                                              @DYALLOC.2827   
*CALL ARGOCTOP                                                             @DYALLOC.2829   
*CALL ARGPPX                                                               GSS1F400.1479   
*CALL ARGOINDX                                                             OFR1F404.2      
     # LL_ASS_BTRP, DU_ASS_BTRP, DV_ASS_BTRP,                              @DYALLOC.2830   
     # STASH_MAXLEN(NO_STSH_OA,im_index), NO_STSH_OA)                      GRB4F305.344    
        IF (ICODE .GT. 0) GO TO 999                                        OCNSTEP1.96     
      END IF   ! LASSIMILATION                                             OCNSTEP1.97     
C                                                                          OCNSTEP1.98     
CL 3. If analysis steps are less frequent than forecast steps then         OCNSTEP1.99     
CL     CALL OC_ADD_INC                                                     OCNSTEP1.100    
C                                                                          OCNSTEP1.101    
      IF (LAS_ADD_INC) THEN                                                OCNSTEP1.102    
CCC      CALL OC_ADD_INC(ICODE,CMESSAGE, IMT, JMT,                         OCNSTEP1.103    
CCC   #       LL_ASS_BTRP, DU_ASS_BTRP, DV_ASS_BTRP)                       OCNSTEP1.104    
        IF (ICODE .GT. 0) GO TO 999                                        OCNSTEP1.105    
      END IF                                                               OCNSTEP1.106    
                                                                           TJ270193.109    
      IF (L_WRIT_OCNSTEP .AND.                                             GSS1F304.102    
     &    (STEPim(o_im).LE.T_WRITD1_END .OR. T_WRITD1_END .EQ. 0)) THEN    GDR5F305.135    
                                                                           GSS1F304.104    
      IF (STEPim(o_im).EQ.T_WRITD1_START .OR.                              GDR5F305.136    
     &    WRITD1_TEST.GT.WRITD1_TEST_PREV) THEN                            GSS1F304.106    
                                                                           GSS1F304.107    
           CALL DUMPCTL (                                                  GKR4F403.317    
*CALL ARGSIZE                                                              GKR4F403.318    
*CALL ARGD1                                                                GKR4F403.319    
*CALL ARGDUMA                                                              GKR4F403.320    
*CALL ARGDUMO                                                              GKR4F403.321    
*CALL ARGDUMW                                                              GKR4F403.322    
*CALL ARGCONA                                                              GKR4F403.323    
*CALL ARGPTRA                                                              GKR4F403.324    
*CALL ARGSTS                                                               GKR4F403.325    
*CALL ARGPPX                                                               GKR4F403.326    
     &          ocean_sm,0,.TRUE.,'af_oc_ac_c',STEPim(o_im),               GIE1F405.15     
     &          ICODE,CMESSAGE)                                            GKR4F403.328    
                                                                           GSS1F304.109    
      END IF                                                               GSS1F304.110    
                                                                           GSS1F304.111    
      END IF                                                               GSS1F304.112    
C                                                                          GSS1F304.113    
      ELSE                                                                 ORH1F305.5422   
         ! Initialise dummy vars when Ocean assimilation not used.         ORH1F305.5423   
         LL_ASS_BTRP = .false.                                             ORH1F305.5424   
         DU_ASS_BTRP(1,1) = 0.0                                            ORH1F305.5425   
         DV_ASS_BTRP(1,1) = 0.0                                            ORH1F305.5426   
      ENDIF   ! L_OCNASSM                                                  ORH1F305.5427   
C                                                                          OCNSTEP1.108    
CL 4. Perform a forward model time step; CALL OCN_FOR_STEP                 OCNSTEP1.109    
C                                                                          OCNSTEP1.110    
      CALL OCN_FOR_STEP(                                                   @DYALLOC.2832   
*CALL ARGSIZE                                                              @DYALLOC.2833   
*CALL ARGD1                                                                @DYALLOC.2834   
*CALL ARGDUMA                                                              @DYALLOC.2835   
*CALL ARGDUMO                                                              @DYALLOC.2836   
*CALL ARGDUMW                                                              GKR1F401.247    
*CALL ARGPTRO                                                              @DYALLOC.2838   
*CALL ARGSTS                                                               @DYALLOC.2839   
*CALL ARGCONO                                                              @DYALLOC.2841   
*CALL ARGOCTOP                                                             @DYALLOC.2842   
*CALL ARGBND                                                               SI180893.26     
*CALL ARGPPX                                                               GKR0F305.972    
*CALL ARGOINDX                                                             ORH7F402.69     
     & ICODE,CMESSAGE,LL_ASS_BTRP,DU_ASS_BTRP,DV_ASS_BTRP)                 OOM1F405.337    
C                                                                          OCNSTEP1.116    
      IF (L_OCNASSM) THEN                                                  ORH1F305.5428   
C                                                                          OCNSTEP1.118    
      IF (ICODE .GT. 0) GO TO 999                                          OCNSTEP1.119    
C                                                                          OCNSTEP1.124    
      ENDIF   ! L_OCNASSM                                                  ORH1F305.5429   
 999  CONTINUE                                                             ORH1F305.5430   
C                                                                          OCNSTEP1.128    
      IF (L_WRIT_OCNSTEP .AND.                                             GSS1F304.114    
     &    (STEPim(o_im).LE.T_WRITD1_END .OR. T_WRITD1_END .EQ. 0)) THEN    GDR5F305.138    
C                                                                          GSS1F304.116    
      IF (STEPim(o_im).EQ.T_WRITD1_START .OR.                              GDR5F305.139    
     &    WRITD1_TEST.GT.WRITD1_TEST_PREV) THEN                            GSS1F304.118    
C                                                                          GSS1F304.119    
           CALL DUMPCTL (                                                  GKR4F403.329    
*CALL ARGSIZE                                                              GKR4F403.330    
*CALL ARGD1                                                                GKR4F403.331    
*CALL ARGDUMA                                                              GKR4F403.332    
*CALL ARGDUMO                                                              GKR4F403.333    
*CALL ARGDUMW                                                              GKR4F403.334    
*CALL ARGCONA                                                              GKR4F403.335    
*CALL ARGPTRA                                                              GKR4F403.336    
*CALL ARGSTS                                                               GKR4F403.337    
*CALL ARGPPX                                                               GKR4F403.338    
     &          ocean_sm,0,.TRUE.,'endocnstep',STEPim(o_im),               GIE1F405.24     
     &          ICODE,CMESSAGE)                                            GKR4F403.340    
C                                                                          GSS1F304.121    
      END IF                                                               GSS1F304.122    
C                                                                          GSS1F304.123    
      END IF                                                               GSS1F304.124    
C                                                                          GSS1F304.125    
      WRITD1_TEST_PREV = WRITD1_TEST                                       GSS1F304.126    
C                                                                          GSS1F304.127    
      RETURN                                                               OCNSTEP1.129    
      END                                                                  OCNSTEP1.130    
C                                                                          OCNSTEP1.131    
*ENDIF OCEAN                                                               OCNSTEP1.132    
*ENDIF CONTROL                                                             OCNSTEP1.133