*IF DEF,CONTROL                                                            OCNFRST1.2      
*IF DEF,OCEAN                                                              GSH1F403.29     
C ******************************COPYRIGHT******************************    GTS2F400.7003   
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved.    GTS2F400.7004   
C                                                                          GTS2F400.7005   
C Use, duplication or disclosure of this code is subject to the            GTS2F400.7006   
C restrictions as set forth in the contract.                               GTS2F400.7007   
C                                                                          GTS2F400.7008   
C                Meteorological Office                                     GTS2F400.7009   
C                London Road                                               GTS2F400.7010   
C                BRACKNELL                                                 GTS2F400.7011   
C                Berkshire UK                                              GTS2F400.7012   
C                RG12 2SZ                                                  GTS2F400.7013   
C                                                                          GTS2F400.7014   
C If no contract has been raised with this copy of the code, the use,      GTS2F400.7015   
C duplication or disclosure of it is strictly prohibited.  Permission      GTS2F400.7016   
C to do so must first be obtained in writing from the Head of Numerical    GTS2F400.7017   
C Modelling at the above address.                                          GTS2F400.7018   
C ******************************COPYRIGHT******************************    GTS2F400.7019   
C                                                                          GTS2F400.7020   
CLL  Subroutine: OCN_FOR_STEP ---------------------------------------      OCNFRST1.4      
CLL                                                                        OCNFRST1.5      
CLL  Purpose: To integrate ocean model by one timestep                     OCNFRST1.6      
CLL                                                                        OCNFRST1.7      
CLL  Tested under compiler:   cft77                                        OCNFRST1.8      
CLL  Tested under OS version: UNICOS 5.1                                   OCNFRST1.9      
CLL                                                                        OCNFRST1.10     
CLL  Author: S.Ineson                                                      OCNFRST1.11     
CLL                                                                        OCNFRST1.12     
CLL  Model            Modification history from model version 3.0:         OCNFRST1.13     
CLL version  Date                                                          OCNFRST1.14     
CLL  Vn1.8   15/03/93 Include ice velocities and wind stress in the        JT101193.6      
CLL                   call to ocn_ctl.                                     JT101193.7      
CLL  3.1   01/03/93   Pass stash variables to ocean control routines       SI010393.1      
CLL   3.1   8/02/93 : added comdeck CHSUNITS to define NUNITS for          RS030293.212    
CLL                   comdeck CCONTROL                                     RS030293.213    
CLL   3.3  08/02/94  Modify calls to TIME2SEC/SEC2TIME to output/input     TJ080294.454    
CLL                  elapsed times in days & secs, for portability. TCJ    TJ080294.455    
CLL 3.4  16/6/94 : Change CHARACTER*(*) to CHARACTER*(80) N.Farnon         ONF0F304.1      
CLL   3.4  20/06/94   Argument LCAL360 passed to TIME2SEC                  GSS1F304.506    
CLL                                                     S.J.Swarbrick      GSS1F304.507    
CLL   3.4  01/09/94  Include comdeck ARGOCTOT - ocean parallelisation      ORH1F304.137    
CLL                  R. Hill.                                              ORH1F304.138    
CLL   3.4   04/08/94  Remove sea ice flux correction. (JFT)                OJT0F304.6      
CLL  3.5  05/06/95  Chgs to STASH_MAXLEN & SI arrays.RTHBarnes             GRB4F305.321    
!    4.2  05/07/96  Set stash super array pointers from joc_tracer,        OKR1F402.1      
!                   joc_u, joc_v on every time step before call to         OKR1F402.2      
!                   STASH for section 0 values. K Rogers                   OKR1F402.3      
!                                                                          OKR1F402.4      
CLL  4.1  Determine dimensions for vorticity diagnostics M. J. Bell        OMB3F401.13     
!    4.4  Pass LCAL360 through to OCN_CTL. R.Forbes                        OFR8F404.1      
CLL  4.4  16/06/97  Add free surface variables to call to OCN_CTL          ORL1F404.712    
CLL                                                      R.Lenton          ORL1F404.713    
CLL  4.5  08/09/97  Amended the call to BOUNDVOL including changing        OSI1F405.117    
CLL                 the logical from L_BOUNDSO to L_OPENBC. C.G. Jones     OSI1F405.118    
!    4.5  Remove ARGPTRA, ARGCONA, TYPPTRA, TYPCONA.                       ORH3F405.74     
CLL                                                                        OCNFRST1.15     
CLL  programming standard :                                                OCNFRST1.16     
CLL                                                                        OCNFRST1.17     
CLL  Logical components covered : F4                                       OCNFRST1.18     
CLL                                                                        OCNFRST1.19     
CLL  system task:                                                          OCNFRST1.20     
CLL                                                                        OCNFRST1.21     
CLL  External documentation:                                               OCNFRST1.22     
CLL                                                                        OCNFRST1.23     
CLLEND-----------------------------------------------------------------    OCNFRST1.24     
C*L Arguments                                                              OCNFRST1.25     
                                                                           OCNFRST1.26     

      SUBROUTINE OCN_FOR_STEP(                                              1,11@DYALLOC.2733   
*CALL ARGSIZE                                                              @DYALLOC.2734   
*CALL ARGD1                                                                @DYALLOC.2735   
*CALL ARGDUMA                                                              @DYALLOC.2736   
*CALL ARGDUMO                                                              @DYALLOC.2737   
*CALL ARGDUMW                                                              GKR1F401.248    
*CALL ARGPTRO                                                              @DYALLOC.2739   
*CALL ARGSTS                                                               @DYALLOC.2740   
*CALL ARGCONO                                                              @DYALLOC.2742   
*CALL ARGOCALL                                                             @DYALLOC.2743   
*CALL ARGBND                                                               SI180893.21     
*CALL ARGPPX                                                               GKR0F305.965    
*CALL ARGOINDX                                                             ORH7F402.70     
     &                        ICODE,CMESSAGE                               @DYALLOC.2744   
     #     , LL_ASS_BTRP, DU_ASS_BTRP, DV_ASS_BTRP                         OCNFRST1.29     
     # )                                                                   OCNFRST1.31     
                                                                           OCNFRST1.32     
      IMPLICIT NONE                                                        OCNFRST1.33     
                                                                           OCNFRST1.34     
      INTEGER                                                              OCNFRST1.35     
     &       ICODE        ! Return code : 0 Normal Exit                    OCNFRST1.36     
C                         !             : >0 Error                         OCNFRST1.37     
                                                                           OCNFRST1.38     
      CHARACTER*(80)                                                       ONF0F304.2      
     &       CMESSAGE     ! Error message if return code >0                OCNFRST1.40     
C*                                                                         OCNFRST1.41     
CL Include COMDECKS containing parameters and D1 array                     OCNFRST1.42     
*CALL OARRYSIZ                                                             ORH6F401.16     
                                                                           OCNFRST1.43     
*CALL CSUBMODL                                                             GDR3F305.145    
*CALL CMAXSIZE                                                             @DYALLOC.2745   
*CALL TYPSIZE                                                              @DYALLOC.2746   
*CALL TYPDUMA                                                              @DYALLOC.2747   
*CALL TYPDUMO                                                              @DYALLOC.2748   
*CALL TYPDUMW                                                              GKR1F401.249    
*CALL TYPD1                                                                @DYALLOC.2749   
*CALL TYPPTRO                                                              @DYALLOC.2751   
*CALL TYPSTS                                                               @DYALLOC.2752   
*CALL TYPCONO                                                              @DYALLOC.2754   
*CALL TYPOINDX                                                             PXORDER.30     
*CALL TYPOCALL                                                             @DYALLOC.2755   
*CALL TYPBND                                                               SI180893.22     
*CALL TYPOCTOT                                                             ORH1F304.139    
*CALL PPXLOOK                                                              GKR0F305.966    
                                                                           OCNFRST1.46     
CL*                                                                        OCNFRST1.48     
      LOGICAL LL_ASS_BTRP ! T => analysis barotropic current increments    OCNFRST1.49     
C                                to be added in to model field             OCNFRST1.50     
C                                                                          OCNFRST1.51     
      REAL DU_ASS_BTRP(IMT_ASM,JMT_ASM) ! barotrpic current increments     ORH1F305.5431   
     &,    DV_ASS_BTRP(IMT_ASM,JMT_ASM) ! calc'd in data analysis step     ORH1F305.5432   
CL Include OTHER COMDECKS                                                  OCNFRST1.56     
                                                                           OCNFRST1.57     
*CALL CHSUNITS                                                             RS030293.214    
*CALL CCONTROL                                                             OCNFRST1.58     
*CALL CTIME                                                                OCNFRST1.59     
                                                                           OCNFRST1.61     
C Local variables                                                          OCNFRST1.62     
                                                                           OCNFRST1.63     
      REAL                                                                 OCNFRST1.64     
     &       TTSEC             ! Elapsed seconds                           OCNFRST1.65     
      INTEGER                                                              OCNFRST1.66     
     &       elapsed_days_out  ! Elapsed days                              TJ080294.456    
     &,      elapsed_secs_out  ! Elapsed seconds                           TJ080294.457    
     &,I,J                                                                 OCNFRST1.68     
     &      ,IM_IDENT      ! internal model identifier                     GRB4F305.322    
     &      ,IM_INDEX      ! internal model index for STASH arrays         GRB4F305.323    
      INTEGER ZVRTITEM    ! first item number for vorticity diagnostics    OMB3F401.14     
      PARAMETER ( ZVRTITEM = 211 )                                         OMB3F401.15     
      INTEGER S_Item      ! stash item number                              OMB3F401.16     
      INTEGER ID          ! loop index for vorticity diagnostics           OMB3F401.17     
                                                                           OCNFRST1.69     
C External subroutines called                                              OCNFRST1.70     
                                                                           OCNFRST1.71     
      EXTERNAL                                                             OCNFRST1.72     
     &       TIME2SEC,                                                     OCNFRST1.73     
     &       BOUNDVOL,                                                     OCNFRST1.74     
     &       OCN_CTL,                                                      OCNFRST1.75     
     &       STASH,                                                        OCNFRST1.76     
     &       CTODUMP,                                                      OCNFRST1.77     
     &       DATASWAP,                                                     OCNFRST1.78     
     &       PNTRSWAP,                                                     OCNFRST1.79     
     &       TIMER                                                         OCNFRST1.80     
                                                                           OCNFRST1.81     
                                                                           OCNFRST1.82     
C  Set up internal model identifier and STASH index                        GRB4F305.324    
      im_ident = ocean_im                                                  GRB4F305.325    
      im_index = internal_model_index(im_ident)                            GRB4F305.326    
                                                                           GRB4F305.327    
      ICODE=0                                                              OCNFRST1.83     
      CMESSAGE='  '                                                        OCNFRST1.84     
                                                                           OCNFRST1.85     
                                                                           OCNFRST1.86     
        IF(LTIMER) THEN                                                    OCNFRST1.87     
          CALL TIMER('OCN_FOR_STEP',3)                                     OCNFRST1.88     
        END IF                                                             OCNFRST1.89     
                                                                           OCNFRST1.90     
                                                                           OCNFRST1.91     
      IF  (L_OPENBC) THEN                                                  OSI1F405.119    
CL Increment lateral boundary values with boundary tendency                OCNFRST1.93     
                                                                           OCNFRST1.94     
      CALL BOUNDVOL(                                                       @DYALLOC.2757   
*CALL ARGSIZE                                                              @DYALLOC.2758   
*CALL ARGOINDX                                                             OSI1F405.120    
*CALL ARGD1                                                                @DYALLOC.2759   
*CALL ARGDUMO                                                              @DYALLOC.2760   
*CALL ARGPTRO                                                              @DYALLOC.2761   
*CALL ARGBND                                                               SI180893.23     
*CALL ARGOCONE                                                             OSI1F405.121    
*CALL ARGOCFLD                                                             OSI1F405.122    
*CALL ARGOCFLW                                                             OSI1F405.123    
     & ICODE, CMESSAGE )                                                   @DYALLOC.2763   
                                                                           OCNFRST1.96     
      ENDIF                                                                ORH1F305.5435   
                                                                           GSS1F304.508    
CL Calculate elapsed seconds since BASIS TIME                              OCNFRST1.98     
                                                                           OCNFRST1.99     
      CALL TIME2SEC (I_YEAR,I_MONTH,I_DAY,I_HOUR,I_MINUTE,I_SECOND         TJ080294.458    
     &,              BASIS_TIME_DAYS,BASIS_TIME_SECS                       TJ080294.459    
     &,              elapsed_days_out,elapsed_secs_out,LCAL360)            GSS1F304.509    
                                                                           OCNFRST1.102    
      IF (elapsed_days_out.GT.3600) THEN  ! Avoid 32-bit INT overflow      TJ080294.461    
        TTSEC=FLOAT(elapsed_secs_out)+FLOAT(elapsed_days_out)*86400.0      TJ080294.462    
      ELSE                                                                 TJ080294.463    
        TTSEC=FLOAT(elapsed_secs_out+elapsed_days_out*86400)               TJ080294.464    
      ENDIF                                                                TJ080294.465    
                                                                           OCNFRST1.104    
CL Sections 21-23  Ocean Routines                                          OCNFRST1.105    
                                                                           OMB3F401.18     
C decide whether to calculate barotropic vorticity diagnostics             OMB3F401.19     
C and set array sizes (which are stored in  OARRYSIZ)                      OMB3F401.20     
                                                                           OMB3F401.21     
      L_OZVRT = .FALSE.                                                    OMB3F401.22     
      DO ID = 1, 10                                                        OMB3F401.24     
        S_Item = ZVRTITEM + ID - 1                                         OMB3F401.25     
        IF ( SF(S_Item, 31) ) L_OZVRT = .TRUE.                             OMB3F401.26     
      END DO                                                               OMB3F401.28     
                                                                           OMB3F401.29     
      IF ( L_OZVRT ) THEN                                                  OMB3F401.30     
        IMT_ZVRT = IMT                                                     OMB3F401.31     
        JMT_ZVRT = JMT                                                     OMB3F401.32     
        N_ZVRT   = 10                                                      OMB3F401.33     
      ELSE                                                                 OMB3F401.34     
        IMT_ZVRT = 1                                                       OMB3F401.35     
        JMT_ZVRT = 1                                                       OMB3F401.36     
        N_ZVRT   = 1                                                       OMB3F401.37     
      ENDIF                                                                OMB3F401.38     
                                                                           OMB3F401.39     
                                                                           OCNFRST1.106    
        IF(LTIMER) THEN                                                    OCNFRST1.107    
          CALL TIMER('OCN_CTL ',3)                                         OCNFRST1.108    
        END IF                                                             OCNFRST1.109    
                                                                           OCNFRST1.110    
                                                                           OCNFRST1.111    
      CALL OCN_CTL(                                                        @DYALLOC.2764   
*CALL ARGSIZE                                                              @DYALLOC.2765   
*CALL ARGD1                                                                @DYALLOC.2766   
*CALL ARGDUMA                                                              @DYALLOC.2767   
*CALL ARGDUMO                                                              @DYALLOC.2768   
*CALL ARGDUMW                                                              GKR1F401.250    
*CALL ARGPTRO                                                              @DYALLOC.2770   
*CALL ARGSTS                                                               @DYALLOC.2771   
*CALL ARGCONO                                                              @DYALLOC.2773   
*CALL ARGOCALL                                                             @DYALLOC.2774   
*CALL ARGPPX                                                               GKR0F305.967    
*CALL ARGOINDX                                                             ORH7F402.72     
     &             ICODE,CMESSAGE                                          @DYALLOC.2775   
                                                                           OCNFRST1.113    
C IN: model description held in dump                                       OCNFRST1.114    
                                                                           OCNFRST1.115    
     &,STEPim(o_im),TTSEC,O_REALHD(7),O_FLDDEPC                            ORH1F405.31     
                                                                           OCNFRST1.118    
C INOUT: primary variables not controlled by FORTXD                        OCNFRST1.119    
                                                                           OCNFRST1.120    
     &,D1(joc_stream(1)),D1(joc_stream(2))                                 OCNFRST1.121    
     &,D1(joc_tend(1)),D1(joc_tend(2))                                     OCNFRST1.122    
     &,D1(joc_cgres),D1(joc_cgresb)                                        ORH1F401.34     
     &,D1(joc_eta),D1(joc_etab),D1(joc_ubt),D1(joc_ubtbbt)                 ORL1F404.714    
     &,D1(joc_vbt),D1(joc_vbtbbt),D1(joc_ubtbbc),D1(joc_vbtbbc)            ORL1F404.715    
     &,D1(joc_mld)                                                         OCNFRST1.124    
     &,D1(joc_snow),D1(joc_mischt),D1(joc_htotoi),D1(joc_salinc)           OCNFRST1.125    
     &,D1(joc_isx),D1(joc_isy)                                             JT101193.8      
     &,D1(joc_icecon),D1(joc_icedep)                                       OCNFRST1.127    
     &,D1(joc_iceu),D1(joc_icev)                                           JT101193.9      
     &,D1(joc_athkdft)                                                     OLA2F403.17     
                                                                           OCNFRST1.128    
C IN:  ancillary fields not controlled by FORTXD                           OCNFRST1.129    
                                                                           OCNFRST1.130    
     &,D1(joc_surfp)                                                       OCNFRST1.131    
     &,D1(joc_heat),D1(joc_solar),D1(joc_snowrate),D1(joc_sublim)          OCNFRST1.132    
     &,D1(joc_topmelt),D1(joc_botmelt),D1(joc_solice),D1(joc_climair)      ORH1F405.32     
     &,D1(joc_climicedep),D1(joc_taux),D1(joc_tauy)                        ORH1F405.33     
     &,D1(joc_anom_heat),D1(joc_anom_salt)                                 OJT0F304.7      
C IN:  assimilation barotropic current increments                          OCNFRST1.140    
     &,LL_ASS_BTRP,DU_ASS_BTRP,DV_ASS_BTRP                                 OCNFRST1.141    
C                                                                          OCNFRST1.142    
                                                                           SI010393.2      
C IN:  pointers to diagnostics                                             OCNFRST1.144    
                                                                           OCNFRST1.145    
     &,SI(201,30,im_index),SI(202,30,im_index),SI(203,30,im_index)         GRB4F305.330    
     &,SI(204,30,im_index),SI(205,30,im_index),SI(208,30,im_index)         GRB4F305.331    
     &,SI(248,30,im_index),SI(249,30,im_index),SI(250,30,im_index)         GRB4F305.332    
     &,SI(251,30,im_index)                                                 GRB4F305.333    
     &,SI(292,30,im_index),SI(293,30,im_index)                             OJP0F404.887    
     &,SI(201,31,im_index),SI(202,31,im_index),SI(201,32,im_index)         GRB4F305.334    
                                                                           OCNFRST1.150    
C IN:  stashflags for diagnostics                                          OCNFRST1.151    
     &,SF(201,30),SF(202,30),SF(203,30),SF(204,30),SF(205,30)              OCNFRST1.152    
     &           ,SF(208,30)                                               SI010393.10     
     &,SF(248,30),SF(249,30),SF(250,30),SF(251,30)                         NT071293.2      
     &,SF(292,30),SF(293,30)                                               OJP0F404.888    
                                                                           OJP0F404.889    
     &,SF(201,31),SF(202,31)                                               OCNFRST1.154    
     &,SF(201,32)                                                          OCNFRST1.155    
                                                                           OCNFRST1.156    
C IN:  lengths for STASH workspace                                         OCNFRST1.157    
                                                                           OCNFRST1.158    
     &,STASH_MAXLEN(30,im_index),STASH_MAXLEN(31,im_index)                 GRB4F305.328    
     &,STASH_MAXLEN(32,im_index)                                           GRB4F305.329    
*CALL ARGOCTOT                                                             ORH1F304.140    
                                                                           OCNFRST1.160    
     &,LCAL360                                                             OFR8F404.2      
     & )                                                                   OCNFRST1.161    
                                                                           OCNFRST1.162    
        IF(LTIMER) THEN                                                    OCNFRST1.163    
          CALL TIMER('OCN_CTL ',4)                                         OCNFRST1.164    
        END IF                                                             OCNFRST1.165    
                                                                           OCNFRST1.166    
      IF(ICODE.GT.0) THEN                                                  OCNFRST1.167    
       RETURN                                                              OCNFRST1.168    
      ENDIF                                                                OCNFRST1.169    
                                                                           OCNFRST1.170    
                                                                           OCNFRST1.171    
CL   Output diagnostics at end of timestep                                 OCNFRST1.172    
                                                                           OKR1F402.5      
!    Swap arrays containing pointers to prognostic variables               OKR1F402.6      
!    within the ocean stash superarray.                                    OKR1F402.7      
                                                                           OKR1F402.8      
      do i = 1, nt                                                         OKR1F402.9      
        o_spsts(o_ixsts(1) + i-1)        = JOC_TRACER(i,1)                 OKR1F402.10     
        o_spsts(o_ixsts(1) + nt + i-1)   = JOC_TRACER(i,2)                 OKR1F402.11     
      end do                                                               OKR1F402.12     
                                                                           OKR1F402.13     
      o_spsts(o_ixsts(2)) = JOC_U(1)                                       OKR1F402.14     
      o_spsts(o_ixsts(2)+1) = JOC_U(2)                                     OKR1F402.15     
      o_spsts(o_ixsts(3)) = JOC_V(1)                                       OKR1F402.16     
      o_spsts(o_ixsts(3)+1) = JOC_V(2)                                     OKR1F402.17     
                                                                           OKR1F402.18     
                                                                           OCNFRST1.173    
      CALL STASH(ocean_sm,ocean_im,0,D1,                                   GKR0F305.968    
*CALL ARGSIZE                                                              @DYALLOC.2777   
*CALL ARGD1                                                                @DYALLOC.2778   
*CALL ARGDUMA                                                              @DYALLOC.2779   
*CALL ARGDUMO                                                              @DYALLOC.2780   
*CALL ARGDUMW                                                              GKR1F401.251    
*CALL ARGSTS                                                               @DYALLOC.2781   
*CALL ARGPPX                                                               GKR0F305.969    
     &                         ICODE,CMESSAGE)                             @DYALLOC.2785   
                                                                           OCNFRST1.175    
        IF (ICODE.GT.0) THEN                                               OCNFRST1.176    
          RETURN                                                           OCNFRST1.177    
        ENDIF                                                              OCNFRST1.178    
                                                                           OCNFRST1.179    
CL   Copy some variables to the header                                     OCNFRST1.180    
                                                                           OCNFRST1.181    
      ! For MPP code, we could arrange to have CTODUMP called              ORH9F402.372    
      ! only by PE 0, since it is only setting up values for               ORH9F402.373    
      ! the dump header, however, there's nothing to be gained             ORH9F402.374    
      ! performance-wise by this, so all PEs perform CTODUMP.              ORH9F402.375    
      CALL CTODUMP(                                                        @DYALLOC.2786   
*CALL ARGSIZE                                                              @DYALLOC.2787   
*CALL ARGDUMO                                                              @DYALLOC.2788   
*CALL ARGOCALL                                                             @DYALLOC.2789   
     & JMT_GLOBAL,                                                         ORH6F402.82     
     *             STEPim(o_im),O_INTHD(1),O_REALHD(20),O_REALHD(21),      GDR5F305.130    
     &    O_REALHD(22),O_REALHD(23)                                        ORH1F304.141    
*CALL ARGOCTOT                                                             ORH1F304.142    
     & )                                                                   ORH1F304.143    
                                                                           OCNFRST1.184    
CL   Copy data for timestep after present to present if DUMP is to         OCNFRST1.185    
CL   be created                                                            OCNFRST1.186    
                                                                           OCNFRST1.187    
      IF (LDUMP) THEN                                                      OCNFRST1.188    
        CALL DATASWAP(O_LEN_DUALDATA                                       OSI0F402.6      
     &                 ,D1(joc_tracer(1,1)),D1(joc_tracer(1,2)))           OCNFRST1.190    
      ENDIF                                                                OCNFRST1.191    
                                                                           OCNFRST1.192    
CL   Swap pointers for next timestep                                       OCNFRST1.193    
                                                                           OCNFRST1.194    
      CALL PNTRSWAP(NT,joc_tracer,joc_u,joc_v)                             OCNFRST1.195    
                                                                           OCNFRST1.196    
                                                                           OCNFRST1.197    
        IF(LTIMER) THEN                                                    OCNFRST1.198    
          CALL TIMER('OCN_FOR_STEP',4)                                     OCNFRST1.199    
        END IF                                                             OCNFRST1.200    
                                                                           OCNFRST1.201    
      RETURN                                                               OCNFRST1.202    
      END                                                                  OCNFRST1.203    
*ENDIF OCEAN                                                               OCNFRST1.204    
*ENDIF CONTROL                                                             OCNFRST1.205