*IF DEF,SEAICE                                                             ORH1F305.450    
C ******************************COPYRIGHT******************************    GTS2F400.4303   
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved.    GTS2F400.4304   
C                                                                          GTS2F400.4305   
C Use, duplication or disclosure of this code is subject to the            GTS2F400.4306   
C restrictions as set forth in the contract.                               GTS2F400.4307   
C                                                                          GTS2F400.4308   
C                Meteorological Office                                     GTS2F400.4309   
C                London Road                                               GTS2F400.4310   
C                BRACKNELL                                                 GTS2F400.4311   
C                Berkshire UK                                              GTS2F400.4312   
C                RG12 2SZ                                                  GTS2F400.4313   
C                                                                          GTS2F400.4314   
C If no contract has been raised with this copy of the code, the use,      GTS2F400.4315   
C duplication or disclosure of it is strictly prohibited.  Permission      GTS2F400.4316   
C to do so must first be obtained in writing from the Head of Numerical    GTS2F400.4317   
C Modelling at the above address.                                          GTS2F400.4318   
C ******************************COPYRIGHT******************************    GTS2F400.4319   
C                                                                          GTS2F400.4320   
C*LL                                                                       ICEDRIFT.3      
CLL   SUBROUTINE ICEDRIFT                                                  ICEDRIFT.4      
CLL   -------------------                                                  ICEDRIFT.5      
CLL                                                                        ICEDRIFT.6      
CLL   Set up masks and variables ready for call to advection               ODC1F405.209    
CLL   routine                                                              ODC1F405.210    
CLL                                                                        ICEDRIFT.10     
CLL   THIS ROUTINE FORMS PART OF SYSTEM COMPONENT P4.                      ICEDRIFT.11     
CLL   IT CAN BE COMPILED BY CFT77, BUT DOES NOT CONFORM TO ANSI            ICEDRIFT.12     
CLL   FORTRAN77 STANDARDS, BECAUSE OF THE INLINE COMMENTS.                 ICEDRIFT.13     
CLL                                                                        ICEDRIFT.14     
CLL   ALL QUANTITIES IN THIS ROUTINE ARE IN S.I. UNITS UNLESS              ICEDRIFT.15     
CLL   OTHERWISE STATED.                                                    ICEDRIFT.16     
CLL                                                                        ICEDRIFT.17     
CLL   WRITTEN BY J.F.THOMSON (25/01/93)                                    ICEDRIFT.18     
CLL                                                                        ICEDRIFT.19     
CLL   Modified 13/05/93 J.F.Thomson                                        ICEDRIFT.20     
CLL            Interpolates between grids in a consistent manner.          ICEDRIFT.21     
CLL   Modified 11/08/93 J.F.Thomson                                        ICEDRIFT.22     
CLL            Simplified for immediate use as GFDL type ice advection.    ICEDRIFT.23     
CLL   Modified 02/09/93 J.F.Thomson                                        ICEDRIFT.24     
CLL            Diffusion term added and zeroing advection in thick ice     ICEDRIFT.25     
CLL            tidied up.                                                  ICEDRIFT.26     
CLL   Modified 08/10/93 T.C.Johns                                          ICEDRIFT.27     
CLL            Converted to nupdate format for compatibility with vn3.2.   ICEDRIFT.28     
CLL   Modified 27/03/95 C.Cooper                                           OCC0F400.127    
CCL            Converted to remove locally set variables, passing them     OCC0F400.128    
CLL            through subroutine call instead.                            OCC0F400.129    
CLL                                                                        ICEDRIFT.29     
!     3.5    16.01.95   Remove *IF dependency. R.Hill                      ORH1F305.4204   
!     4.0     28.09.95    Fix to prevent out of bounds messages            ORH1F400.4      
!                         - HICE(1->imt+1) was previously referred to,     ORH1F400.5      
!                         but only dimensioned 1->imt.                     ORH1F400.6      
CLL  MODEL            MODIFICATION HISTORY SINCE INSERTION IN UM 3.3:      ICEDRIFT.30     
CLL VERSION  DATE                                                          ICEDRIFT.31     
CLL   4.0            Logical OCEAN passed from ICE_CTL. J.F.Crossley       OJC2F400.49     
CLL                                                                        ICEDRIFT.32     
CLL   4.0     8/95   Remove redundant arrays, give diagnostics             OJC3F400.41     
CLL                  meaningful names and tidy code. J.F.Crossley          OJC3F400.42     
CLL   4.3   delhs_dyn becomes a grid-box-mean quantity  J.M.Gregory        OJG3F403.5      
!      4.3    01.02.97   Include further SWAPBOUNDS for mpp. R.Hill        ORH3F403.71     
!     4.5     8/97   Changes for free drift model.                         ODC1F405.211    
!                    Chris Sherlock and Doug Cresswell                     ODC1F405.212    
CLL   4.5  J M Gregory  Rate diagnostics corresponding to increments       OJG1F405.48     
CLL                                                                        ICEDRIFT.33     
CLL    ADHERES TO THE STANDARDS OF DOCUMENTATION PAPER 4, VERSION 1.       ICEDRIFT.34     
CLLEND---------------------------------------------------------------      ICEDRIFT.35     
C*L                                                                        ICEDRIFT.36     

      subroutine icedrift(                                                  1,13ICEDRIFT.37     
*CALL ARGOINDX                                                             ORH7F402.222    
C                                                                          ICEDRIFT.38     
C inout : primary variables, ancillary fields and arrays to communicate    ICEDRIFT.39     
C         with section 30 and with the thermodynamic ice model.            ICEDRIFT.40     
     & aice,hice,hsnow                                                     ICEDRIFT.41     
     &,uice,vice                                                           ODC1F405.213    
     &,icy,newice                                                          ICEDRIFT.43     
     &,ocean                                                               OJC2F400.50     
C                                                                          ICEDRIFT.45     
C in : model data.                                                         ICEDRIFT.46     
     &,imt,imtm1,imtm2,jmt,jmtm1,km,fkmp                                   ORH3F405.95     
C                                                                          ICEDRIFT.48     
C out : fields required by icefloe and ocean model.                        ICEDRIFT.49     
C                                                                          ICEDRIFT.53     
C in : constants required by pseudair.                                     ICEDRIFT.54     
C                                                                          ICEDRIFT.55     
     &,phi,phit,aicemin,aicemax                                            ORH3F405.94     
     &,hicemin,ah_ice                                                      OCC0F400.130    
     &,dphi,dlambda,dtts                                                   ICEDRIFT.57     
     &,cs,cstr,dyur,dytr,dxu2r,dxt4r                                       ICEDRIFT.58     
     &,radius                                                              ODC1F405.214    
     &,delhi_dyn,delhs_dyn,diag_uice,diag_vice                             ODC1F405.215    
     &,dela_dyn,delhi_diff                                                 OJC3F400.45     
     &,sf_delhi_dyn,sf_delhs_dyn,sf_diag_uice,sf_diag_vice                 ODC1F405.216    
     &,sf_dela_dyn,sf_delhi_diff                                           OJC3F400.47     
     &,ddt_aice_dyn,ddt_hice_dyn,ddt_snow_dyn,ddt_hice_diff                OJG1F405.49     
     &,sf_ddt_aice_dyn,sf_ddt_hice_dyn,sf_ddt_snow_dyn,sf_ddt_hice_diff    OJG1F405.50     
     & )                                                                   ICEDRIFT.65     
C                                                                          ICEDRIFT.66     
      IMPLICIT NONE                                                        ODC1F405.217    
C                                                                          ICEDRIFT.68     
*CALL CNTLOCN                                                              ORH1F305.4205   
*CALL OARRYSIZ                                                             ORH1F305.4206   
*CALL TYPOINDX                                                             ORH7F402.223    
      integer                                                              ICEDRIFT.69     
     & imt                ! in    number of tracer columns.                ICEDRIFT.70     
     &,imtm2              ! in    number of tracer columns minus 2.        ICEDRIFT.71     
     &,jmt                ! in    number of tracer rows.                   ICEDRIFT.72     
     &,jmtm1              ! in    number of tracer rows minus 1.           ICEDRIFT.73     
     &,km                 ! in    no of levels                             ORH6F402.114    
      real                                                                 ICEDRIFT.75     
     & aice(imt,jmt)      ! inout fractional ice concentration.            ICEDRIFT.76     
     &,hice(imt,jmt)      ! inout depth averaged over grid square (m)      ICEDRIFT.77     
     &,hsnow(imt,jmt)     ! inout snow depth over ice fraction only (m)    ICEDRIFT.78     
      logical                                                              ICEDRIFT.81     
     & icy(imt,jmt)       ! inout true for ocean points with aice > .001   ICEDRIFT.82     
     &,newice(imt,jmt)    ! inout true for points where ice is forming.    ICEDRIFT.83     
     &,ocean(imt,jmt)     ! inout true for ocean points                    OJC2F400.51     
      real                                                                 ICEDRIFT.84     
     & fkmp(imt,jmt)      ! in    number of levels at tracer points.       ICEDRIFT.85     
     &,uice(imt,jmtm1)! in    zonal ice velocity.                          ODC1F405.218    
     &,vice(imt,jmtm1)! in    meridional ice velocity.                     ODC1F405.219    
     &,phi(jmt)           ! in    latitude of velocity rows in radians.    ICEDRIFT.90     
     &,phit(jmt)          ! in    latitude of mass rows in radians.        ICEDRIFT.91     
      real                                                                 ICEDRIFT.92     
     & radius             ! in    radius of the earth in metres.           ODC1F405.220    
     &,dphi(jmt)          ! in    meridional grid spacing in radians.      ICEDRIFT.98     
     &,dlambda(imt)       ! in    zonal grid spacing in radians.           ICEDRIFT.99     
     &,dtts               ! in    tracer timestep in seconds.              ICEDRIFT.100    
     &,aicemin            ! in    minimum ice fraction.                    ICEDRIFT.101    
     &,aicemax(jmt)       ! in    maximum ice fraction.                    ICEDRIFT.102    
     &,hicemin            ! in    minimum ice depth.                       OCC0F400.135    
     &,ah_ice             ! in    ice diffusion coefficient                OCC0F400.136    
      real cs(jmt),cstr(jmt),dyur(jmt),dytr(jmt)                           ICEDRIFT.103    
     &,dxu2r(imt),dxt4r(imt)                                               ICEDRIFT.104    
      real                                                                 ORH1F305.4207   
     & delhi_dyn(icol_cyc,jmt)   ! out increment in hice (dynamics)        OJC3F400.48     
     &,delhs_dyn(icol_cyc,jmt)   ! out GBM increment in hsno (dynamics)    OJG3F403.6      
     &,diag_uice(icol_cyc,jmtm1)! out u ice             (dynamics)         ODC1F405.221    
     &,diag_vice(icol_cyc,jmtm1)! out v ice         (dynamics)             ODC1F405.222    
     &,dela_dyn(icol_cyc,jmt)    ! out increment in aice (dynamics)        OJC3F400.52     
     &,delhi_diff(icol_cyc,jmt)  ! out increment in hice (diffusion)       OJC3F400.53     
     &,ddt_aice_dyn(icol_cyc,jmt) ! OUT d/dt AICE                          OJG1F405.51     
     &,ddt_hice_dyn(icol_cyc,jmt) ! OUT d/dt HICE                          OJG1F405.52     
     &,ddt_snow_dyn(icol_cyc,jmt) ! OUT d/dt GBM snowdepth                 OJG1F405.53     
     &,ddt_hice_diff(icol_cyc,jmt) ! OUT d/dt HICE diffusion               OJG1F405.54     
      LOGICAL                                                              ICEDRIFT.129    
     & sf_delhi_dyn,sf_delhs_dyn,sf_diag_uice,sf_diag_vice                 ODC1F405.223    
     +,sf_dela_dyn,sf_delhi_diff  ! in  stash flags                        OJC3F400.55     
     &,sf_ddt_aice_dyn,sf_ddt_hice_dyn,sf_ddt_snow_dyn,sf_ddt_hice_diff    OJG1F405.55     
C                                                                          ICEDRIFT.132    
C variables local to this subroutine are now defined                       ICEDRIFT.133    
C                                                                          ICEDRIFT.134    
      integer                                                              ICEDRIFT.135    
     & i,j              ! loop counters                                    ICEDRIFT.136    
     &,imtm1            ! number of tracer columns minus 1                 ICEDRIFT.137    
C                                                                          ICEDRIFT.138    
      real                                                                 ICEDRIFT.139    
     &        zero      ! 0.0                                              ICEDRIFT.140    
     &,       uv        ! workspace scalar.                                ICEDRIFT.143    
C                                                                          ICEDRIFT.153    
      real                                                                 ICEDRIFT.154    
     & hmask(imt,jmt)   ! 1.0 for land 0.0 for sea points.                 ICEDRIFT.155    
     &,umask(imt,jmtm1) ! 1.0 for uv land 0.0 for sea.                     ICEDRIFT.156    
C                                                                          ICEDRIFT.159    
      real                                                                 ICEDRIFT.160    
     & uice_c(imt,jmtm1)! u ice on C grid h pts                            ODC1F405.224    
     &,vice_c(imt,jmtm1)! v ice on C grid h pts                            ODC1F405.225    
     &,aice_old(imt,jmt)    ! initial ice fraction                         ICEDRIFT.163    
     &,hice_old(imt,jmt)    ! initial ice depth                            ICEDRIFT.164    
     &,hice_cu(imt,jmtm1)   ! ice depth on c grid u points                 ICEDRIFT.165    
     &,hice_cv(imt,jmtm1)   ! ice depth on c grid v points                 ICEDRIFT.166    
     &,hsnow_old(imt,jmt)   ! initial snow depth                           ICEDRIFT.167    
     &,diffus(imt,jmt)      ! ice depth increments due to diffusion        ICEDRIFT.168    
     &,aa                                                                  ICEDRIFT.170    
     &,bb                                                                  ICEDRIFT.171    
     &,cc                                                                  ICEDRIFT.172    
     &,dd                                                                  ICEDRIFT.173    
     &,tempa(imt)                                                          ICEDRIFT.174    
     &,dttsr ! Reciprocal of timestep                                      OJG1F405.56     
C*                                                                         ICEDRIFT.176    
C start executable code                                                    ICEDRIFT.177    
C                                                                          ICEDRIFT.178    
C initialise various constants.                                            OJC3F400.56     
      zero  = 0.000E+00                                                    ICEDRIFT.187    
      dttsr=1.0/dtts                                                       OJG1F405.57     
C                                                                          ICEDRIFT.191    
C First set up land sea and ice-free sea masks                             ICEDRIFT.192    
C                                                                          ICEDRIFT.193    
      do j = J_1,J_jmt                                                     ORH3F402.208    
        do i = 1,imt                                                       ICEDRIFT.195    
          hmask(i,j)    =  min ( 1.0 , fkmp(i,j) )                         ICEDRIFT.197    
        end do                                                             ICEDRIFT.203    
      end do                                                               ICEDRIFT.204    
C                                                                          ICEDRIFT.205    
*IF DEF,MPP                                                                ORH4F402.113    
C=====================================================================     ORH4F402.114    
C CALL TO SWAPBOUNDS FOR HALO UPDATE IN MPP VERSION                        ORH4F402.115    
C=====================================================================     ORH4F402.116    
                                                                           ORH4F402.117    
      CALL SWAPBOUNDS(HMASK,IMT,JMT,O_EW_HALO,O_NS_HALO,1)                 ORH4F402.118    
                                                                           ORH4F402.119    
*ENDIF                                                                     ORH4F402.120    
                                                                           ORH4F402.121    
C Calculate Arakawa B grid ice velocity mask.                              ICEDRIFT.206    
C ??? needs extra code to run without cyclic boundary conditions.          ICEDRIFT.207    
      do j = J_1,J_jmtm1                                                   ORH3F402.209    
        do i = 2,imtm1                                                     ICEDRIFT.209    
          umask(i,j)    =  1.0                                             ICEDRIFT.210    
          uv = hmask(i,j)+hmask(i+1,j)+hmask(i,j+1)+hmask(i+1,j+1)         ICEDRIFT.211    
          if (uv.lt.3.5)  umask(i,j)    =  0.0                             ICEDRIFT.212    
        end do                                                             ICEDRIFT.213    
      IF (.NOT.(L_OCYCLIC)) THEN                                           ORH1F305.4214   
        umask(1,j)      =  1.0                                             ICEDRIFT.215    
        uv = hmask(1,j) + hmask(1,j+1)                                     ICEDRIFT.216    
        if (uv.lt.1.5)    umask(1,j)  =  0.0                               ICEDRIFT.217    
        umask(imt,j)    =  1.0                                             ICEDRIFT.218    
        uv = hmask(imt,j) + hmask(imt,j+1)                                 ICEDRIFT.219    
        if (uv.lt.1.5)    umask(imt,j)  =  0.0                             ICEDRIFT.220    
      ENDIF                                                                ORH1F305.4215   
      end do                                                               ICEDRIFT.222    
      IF (L_OCYCLIC) THEN                                                  ORH1F305.4216   
C                                                                          ICEDRIFT.224    
C Make masking arrays cyclic if necessary.                                 ICEDRIFT.225    
C                                                                          ICEDRIFT.226    
      do j = J_1,J_jmt                                                     ORH3F402.210    
        ocean(1,j)      =  ocean(imtm1,j)                                  ICEDRIFT.228    
        ocean(imt,j)    =  ocean(2,j)                                      ICEDRIFT.229    
        hmask(1,j)      =  hmask(imtm1,j)                                  ICEDRIFT.230    
        hmask(imt,j)    =  hmask(2,j)                                      ICEDRIFT.231    
      end do                                                               ICEDRIFT.232    
      do j = J_1,J_jmtm1                                                   ORH3F402.211    
        umask(1,j)      =  umask(imtm1,j)                                  ICEDRIFT.234    
        umask(imt,j)    =  umask(2,j)                                      ICEDRIFT.235    
      end do                                                               ICEDRIFT.236    
      ENDIF                                                                ORH1F305.4217   
C                                                                          ICEDRIFT.238    
C Interpolate velocities to C grid.                                        ODC1F405.226    
C                                                                          ICEDRIFT.240    
      call uv_to_cu(                                                       ORH7F402.224    
*CALL ARGOINDX                                                             ORH7F402.225    
     & uice,uice_c,jmtm1,imt)                                              ODC1F405.227    
      call uv_to_cv(                                                       ORH7F402.227    
*CALL ARGOINDX                                                             ORH7F402.228    
     & vice,vice_c,jmtm1,imt)                                              ODC1F405.228    
C Copy initial ice depths and snow depths to workspace                     ICEDRIFT.243    
      do j = J_1,J_jmt                                                     ORH3F402.212    
        do i=1,imt                                                         ICEDRIFT.245    
          aice_old(i,j) = aice(i,j)                                        ICEDRIFT.246    
          hice_old(i,j) = hice(i,j)                                        ICEDRIFT.247    
          hsnow_old(i,j) = hsnow(i,j)                                      ICEDRIFT.248    
          diffus(i,j) = 0.0                                                ICEDRIFT.249    
        end do                                                             ICEDRIFT.250    
      end do                                                               ICEDRIFT.251    
*IF DEF,MPP                                                                ORH3F403.72     
      CALL SWAPBOUNDS(HMASK,IMT,JMT,O_EW_HALO,O_NS_HALO,1)                 ORH3F403.74     
*ENDIF                                                                     ORH3F403.75     
                                                                           ORH3F403.76     
       IF(L_ICESIMPLE)THEN                                                 ODC1F405.229    
C Zero currents if ice depth >= 4 metres and ice flowing to thicker area   ODC1F405.230    
      call h_to_cu(                                                        ORH7F402.230    
*CALL ARGOINDX                                                             ORH7F402.231    
     & hice,hice_cu,jmt,jmtm1,imt)                                         ORH7F402.232    
      do j = J_1,J_jmtm1                                                   ORH3F402.213    
        do i=1,imt-1                                                       ICEDRIFT.255    
          if (hice_cu(i,j) .gt. 4.0                                        ICEDRIFT.256    
     &    .and.uice_c(i,j)*(hice(i+1,j+1)-hice(i,j+1)).gt.0)               ODC1F405.232    
     &    uice_c(i,j)=0.0                                                  ODC1F405.233    
        end do                                                             ICEDRIFT.259    
      IF (L_OCYCLIC) THEN                                                  ORH1F305.4218   
        uice_c(imt,j)=uice_c(2,j)                                          ODC1F405.234    
      ENDIF                                                                ORH1F305.4219   
      end do                                                               ICEDRIFT.263    
      call h_to_cv(                                                        ORH7F402.233    
*CALL ARGOINDX                                                             ORH7F402.234    
     & hice,hice_cv,jmt,jmtm1,imt)                                         ORH7F402.235    
      do j = J_1,J_jmtm1                                                   ORH3F402.214    
       do i=1,imt-1                                                        ORH1F400.7      
          if (hice_cv(i,j) .gt. 4.0                                        ICEDRIFT.267    
     &    .and.vice_c(i,j)*(hice(i+1,j+1)-hice(i+1,j)).gt.0)               ODC1F405.235    
     &    vice_c(i,j)=0.0                                                  ODC1F405.236    
        end do                                                             ICEDRIFT.270    
      end do                                                               ICEDRIFT.271    
       ENDIF                                                               ODC1F405.231    
C                                                                          ICEDRIFT.272    
C Call ice_advect to advect ice thickness, compactness and snow depth.     ICEDRIFT.273    
C                                                                          ICEDRIFT.274    
      call ice_advect(                                                     ICEDRIFT.275    
*CALL ARGOINDX                                                             ORH7F402.236    
     &      uice_c,vice_c,aice,hice,hsnow,hmask,umask,icy                  ODC1F405.237    
     &                 ,imt,imtm2,jmt,jmtm1                                ORH3F405.96     
     &                 ,phi,phit,dphi,dlambda,radius,dtts                  ORH6F402.116    
     &               )                                                     ICEDRIFT.278    
      IF (L_OCYCLIC) THEN                                                  ORH1F305.4220   
C                                                                          ICEDRIFT.280    
C Make primary arrays cyclic if necessary                                  ICEDRIFT.281    
C                                                                          ICEDRIFT.282    
      do j = J_1,J_jmt                                                     ORH3F402.215    
        hice(1,j)    = hice(imtm1,j)                                       ICEDRIFT.284    
        hice(imt,j)  = hice(2,j)                                           ICEDRIFT.285    
        aice(1,j)    = hice(imtm1,j)                                       ICEDRIFT.286    
        aice(imt,j)  = hice(2,j)                                           ICEDRIFT.287    
        hsnow(1,j)   = hice(imtm1,j)                                       ICEDRIFT.288    
        hsnow(imt,j) = hice(2,j)                                           ICEDRIFT.289    
      end do                                                               ICEDRIFT.290    
      ENDIF                                                                ORH1F305.4221   
C                                                                          ICEDRIFT.292    
C Calculate diffusion increments using del2 (taken from TRACER)            ICEDRIFT.293    
C                                                                          ICEDRIFT.294    
C Extend hmask to be zero over all ice-free areas to prevent diffusion     ICEDRIFT.295    
C out from ice edge                                                        ICEDRIFT.296    
C                                                                          ICEDRIFT.297    
      do j = J_1,J_jmt                                                     ORH3F402.216    
        do i=1,imt                                                         ICEDRIFT.299    
          if (ocean(i,j) .and. (aice(i,j).eq.zero)) hmask(i,j)=0.0         ICEDRIFT.300    
        end do                                                             ICEDRIFT.301    
      end do                                                               ICEDRIFT.302    
*IF DEF,MPP                                                                ORH3F403.77     
      CALL SWAPBOUNDS(HICE,IMT,JMT,O_EW_HALO,O_NS_HALO,1)                  ORH3F403.78     
      CALL SWAPBOUNDS(HMASK,IMT,JMT,O_EW_HALO,O_NS_HALO,1)                 ORH3F403.79     
*ENDIF                                                                     ORH3F403.80     
      do j = J_2,J_jmtm1                                                   ORH3F402.217    
        BB=8.0*AH_ICE*CSTR(J)*CSTR(J)                                      OCC0F400.141    
        CC=AH_ICE*CS(J  )*DYUR(J  )*DYTR(J)*CSTR(J)*1.0E4                  OCC0F400.142    
        DD=AH_ICE*CS(J-1)*DYUR(J-1)*DYTR(J)*CSTR(J)*1.0E4                  OCC0F400.143    
        do i=2,imtm1                                                       ICEDRIFT.307    
          TEMPA(I)=DXU2R(I-1)*(HICE(I,J)-HICE(I-1,J))*1.0E2                ICEDRIFT.308    
        end do                                                             ICEDRIFT.309    
      IF (L_OCYCLIC) THEN                                                  ORH1F305.4222   
        TEMPA(IMT) = TEMPA(2)                                              ICEDRIFT.311    
        TEMPA(1)   = TEMPA(IMTM1)                                          ICEDRIFT.312    
      ENDIF                                                                ORH1F305.4223   
        do i=2,imtm1                                                       ICEDRIFT.314    
          DIFFUS(I,J)=hmask(i,j)*( BB*DXT4R(I)*1.0E2                       ICEDRIFT.315    
     *      *(HMASK(I+1,J)*TEMPA(I+1)-HMASK(I-1,J)*TEMPA(I))               ICEDRIFT.316    
     *      +CC*HMASK(I,J+1)*(HICE(I,J+1)-HICE(I,J))                       ICEDRIFT.317    
     *      +DD*HMASK(I,J-1)*(HICE(I,J-1)-HICE(I,J)) )                     ICEDRIFT.318    
        end do                                                             ICEDRIFT.319    
      IF (L_OCYCLIC) THEN                                                  ORH1F305.4224   
        diffus(imt,j) = diffus(2,j)                                        ICEDRIFT.321    
        diffus(1,j)   = diffus(imtm1,j)                                    ICEDRIFT.322    
      ENDIF                                                                ORH1F305.4225   
      end do                                                               ICEDRIFT.324    
C                                                                          ICEDRIFT.325    
C Add in diffusion increments.                                             ICEDRIFT.326    
C                                                                          ICEDRIFT.327    
      do j = J_2,J_jmtm1                                                   ORH3F402.218    
        do i=2,imtm1                                                       ICEDRIFT.329    
          hice(i,j) = hice(i,j) + diffus(i,j)*dtts                         ICEDRIFT.330    
        end do                                                             ICEDRIFT.331    
        hice(1,j)   = hice(imtm1,j)                                        ICEDRIFT.332    
        hice(imt,j) = hice(2,j)                                            ICEDRIFT.333    
      end do                                                               ICEDRIFT.334    
C                                                                          ICEDRIFT.335    
C Adjust ice fractions greater than the max, or less than the min.         ICEDRIFT.336    
C Also adjust snow depth accordingly and reset icy and newice.             ICEDRIFT.337    
C                                                                          ICEDRIFT.338    
      do j = J_1,J_jmt                                                     ORH3F402.219    
        do i=1,imt                                                         ICEDRIFT.340    
          if (aice(i,j).gt.aicemax(j)) then                                ICEDRIFT.341    
            hsnow(i,j) = hsnow(i,j)*aice(i,j)/aicemax(j)                   ICEDRIFT.342    
            aice(i,j)  = aicemax(j)                                        ICEDRIFT.343    
          elseif (aice(i,j).gt.zero .and. aice(i,j).lt.aicemin             ICEDRIFT.344    
     &            .and. fkmp(i,j).gt.0.5) then                             ICEDRIFT.345    
            hsnow(i,j) = hsnow(i,j)*aice(i,j)/aicemin                      ICEDRIFT.346    
            aice(i,j)  = aicemin                                           ICEDRIFT.347    
          endif                                                            ICEDRIFT.348    
          icy(i,j) = (aice(i,j).gt.zero)                                   ICEDRIFT.349    
          if (icy(i,j)) newice(i,j)=.false.                                ICEDRIFT.365    
        end do                                                             ICEDRIFT.366    
      end do                                                               ICEDRIFT.367    
      IF (L_OCYCLIC) THEN                                                  ORH1F305.4226   
C                                                                          ICEDRIFT.369    
C make cyclic if necessary                                                 ICEDRIFT.370    
C                                                                          ICEDRIFT.371    
      do j = J_1,J_jmt                                                     ORH3F402.220    
        aice(1,j)       =  aice(imtm1,j)                                   ICEDRIFT.373    
        aice(imt,j)     =  aice(2,j)                                       ICEDRIFT.374    
        hice(1,j)       =  hice(imtm1,j)                                   ICEDRIFT.375    
        hice(imt,j)     =  hice(2,j)                                       ICEDRIFT.376    
        hsnow(1,j)      =  hsnow(imtm1,j)                                  ICEDRIFT.377    
        hsnow(imt,j)    =  hsnow(2,j)                                      ICEDRIFT.378    
        icy(1,j)        =  icy(imtm1,j)                                    ICEDRIFT.379    
        icy(imt,j)      =  icy(2,j)                                        ICEDRIFT.380    
        newice(1,j)     =  newice(imtm1,j)                                 ICEDRIFT.381    
        newice(imt,j)   =  newice(2,j)                                     ICEDRIFT.382    
      end do                                                               ICEDRIFT.383    
      ENDIF                                                                ORH1F305.4227   
C copy diagnostics to stash workspace                                      ICEDRIFT.385    
      IF (sf_delhi_dyn) THEN                                               OJG1F405.58     
        do j = J_1,J_jmt                                                   OJG1F405.59     
          do i = 1, icol_cyc                                               OJG1F405.60     
            IF (OCEAN(I,J)) THEN                                           OJG1F405.61     
              delhi_dyn(I,J) = HICE(I,J)-HICE_OLD(I,J)                     OJG1F405.62     
            ENDIF                                                          OJG1F405.63     
          end do                                                           OJG1F405.64     
        end do                                                             OJG1F405.65     
      ENDIF                                                                OJG1F405.66     
      IF (sf_ddt_aice_dyn) THEN                                            OJG1F405.67     
        do j = J_1,J_jmt                                                   OJG1F405.68     
          do i = 1, icol_cyc                                               OJG1F405.69     
            IF (OCEAN(I,J)) THEN                                           OJG1F405.70     
              ddt_aice_dyn(I,J) = dttsr*(AICE(I,J)-AICE_OLD(I,J))          OJG1F405.71     
            ENDIF                                                          OJG1F405.72     
          end do                                                           OJG1F405.73     
        end do                                                             OJG1F405.74     
      ENDIF                                                                OJG1F405.75     
      IF (sf_ddt_hice_dyn) THEN                                            OJG1F405.76     
        do j = J_1,J_jmt                                                   OJG1F405.77     
          do i = 1, icol_cyc                                               OJG1F405.78     
            IF (OCEAN(I,J)) THEN                                           OJG1F405.79     
              ddt_hice_dyn(I,J) = dttsr*(HICE(I,J)-HICE_OLD(I,J))          OJG1F405.80     
            ENDIF                                                          OJG1F405.81     
          end do                                                           OJG1F405.82     
        end do                                                             OJG1F405.83     
      ENDIF                                                                OJG1F405.84     
      IF (sf_delhs_dyn) THEN                                               OJG1F405.85     
        do j = J_1,J_jmt                                                   OJG1F405.86     
          do i = 1, icol_cyc                                               OJG1F405.87     
            IF (OCEAN(I,J)) THEN                                           OJG1F405.88     
             delhs_dyn(I,J) = HSNOW(I,J)*AICE(I,J)                         OJG1F405.89     
     &       -HSNOW_OLD(I,J)*AICE_OLD(I,J)                                 OJG1F405.90     
            ENDIF                                                          OJG1F405.91     
          end do                                                           OJG1F405.92     
        end do                                                             OJG1F405.93     
      ENDIF                                                                OJG1F405.94     
      IF (sf_ddt_snow_dyn) THEN                                            OJG1F405.95     
        do j = J_1,J_jmt                                                   OJG1F405.96     
          do i = 1, icol_cyc                                               OJG1F405.97     
            IF (OCEAN(I,J)) THEN                                           OJG1F405.98     
             ddt_snow_dyn(I,J) = dttsr*(HSNOW(I,J)*AICE(I,J)               OJG1F405.99     
     &       -HSNOW_OLD(I,J)*AICE_OLD(I,J))                                OJG1F405.100    
            ENDIF                                                          OJG1F405.101    
          end do                                                           OJG1F405.102    
        end do                                                             OJG1F405.103    
      ENDIF                                                                OJG1F405.104    
      IF (sf_diag_uice) THEN                                               ODC1F405.238    
        do j = J_1,J_jmtm1                                                 ORH3F402.222    
        do i = 1, icol_cyc                                                 ORH1F305.4229   
            if (umask(i,j).gt.0.5)                                         ICEDRIFT.411    
     &        diag_uice(I,J) = uice(i,j)                                   ODC1F405.239    
          end do                                                           ICEDRIFT.413    
        end do                                                             ICEDRIFT.414    
      ENDIF                                                                ICEDRIFT.415    
      IF (sf_diag_vice) THEN                                               ODC1F405.240    
        do j = J_1,J_jmtm1                                                 ORH3F402.223    
        do i = 1, icol_cyc                                                 ORH1F305.4230   
            if (umask(i,j).gt.0.5)                                         ICEDRIFT.423    
     &        diag_vice(I,J) = vice(i,j)                                   ODC1F405.241    
          end do                                                           ICEDRIFT.425    
        end do                                                             ICEDRIFT.426    
      ENDIF                                                                ICEDRIFT.427    
      IF (sf_dela_dyn) THEN                                                OJC3F400.65     
        do j = J_1,J_jmt                                                   ORH3F402.224    
        do i = 1, icol_cyc                                                 ORH1F305.4231   
            if (ocean(i,j))                                                ICEDRIFT.435    
     &        dela_dyn(I,J) = AICE(I,J) - AICE_OLD(I,J)                    OJC3F400.66     
          end do                                                           ICEDRIFT.437    
        end do                                                             ICEDRIFT.438    
      ENDIF                                                                ICEDRIFT.439    
      IF (sf_delhi_diff) THEN                                              OJC3F400.67     
        do j = J_1,J_jmt                                                   ORH3F402.225    
        do i = 1, icol_cyc                                                 ORH1F305.4232   
            if (ocean(i,j))                                                ICEDRIFT.447    
     &        delhi_diff(I,J) = DIFFUS(I,J)*dtts                           OJC3F400.68     
          end do                                                           ICEDRIFT.449    
        end do                                                             ICEDRIFT.450    
      ENDIF                                                                ICEDRIFT.451    
      IF (sf_ddt_hice_diff) THEN                                           OJG1F405.105    
        do j = J_1,J_jmt                                                   OJG1F405.106    
        do i = 1, icol_cyc                                                 OJG1F405.107    
          if (ocean(i,j)) ddt_hice_diff(I,J) = DIFFUS(I,J)                 OJG1F405.108    
        end do                                                             OJG1F405.109    
        end do                                                             OJG1F405.110    
      ENDIF                                                                OJG1F405.111    
C                                                                          ICEDRIFT.452    
*IF DEF,MPP                                                                ORH5F403.249    
      IF (sf_delhi_dyn)                                                    ORH5F403.250    
     &CALL SWAPBOUNDS(delhi_dyn,ICOL_CYC,JMT,O_EW_HALO,O_NS_HALO,1)        ORH5F403.251    
      IF (sf_delhs_dyn)                                                    ORH5F403.252    
     &CALL SWAPBOUNDS(delhs_dyn,ICOL_CYC,JMT,O_EW_HALO,O_NS_HALO,1)        ORH5F403.253    
*IF DEF,MPP                                                                ODC1F405.242    
      IF (sf_diag_uice)                                                    ODC1F405.243    
     &CALL SWAPBOUNDS(diag_uice,ICOL_CYC,JMTM1,O_EW_HALO,O_NS_HALO,1)      ODC1F405.244    
      IF (sf_diag_vice)                                                    ODC1F405.245    
     &CALL SWAPBOUNDS(diag_vice,ICOL_CYC,JMTM1,O_EW_HALO,O_NS_HALO,1)      ODC1F405.246    
*ENDIF                                                                     ODC1F405.247    
      IF (sf_dela_dyn)                                                     ORH5F403.258    
     &CALL SWAPBOUNDS(dela_dyn,ICOL_CYC,JMT,O_EW_HALO,O_NS_HALO,1)         ORH5F403.259    
      IF (sf_delhi_diff)                                                   ORH5F403.260    
     &CALL SWAPBOUNDS(delhi_diff,ICOL_CYC,JMT,O_EW_HALO,O_NS_HALO,1)       ORH5F403.261    
      if (sf_ddt_aice_dyn) call swapbounds(ddt_aice_dyn                    OJG1F405.112    
     &,ICOL_CYC,JMT,O_EW_HALO,O_NS_HALO,1)                                 OJG1F405.113    
      if (sf_ddt_hice_dyn) call swapbounds(ddt_hice_dyn                    OJG1F405.114    
     &,ICOL_CYC,JMT,O_EW_HALO,O_NS_HALO,1)                                 OJG1F405.115    
      if (sf_ddt_snow_dyn) call swapbounds(ddt_snow_dyn                    OJG1F405.116    
     &,ICOL_CYC,JMT,O_EW_HALO,O_NS_HALO,1)                                 OJG1F405.117    
      if (sf_ddt_hice_diff) call swapbounds(ddt_hice_diff                  OJG1F405.118    
     &,ICOL_CYC,JMT,O_EW_HALO,O_NS_HALO,1)                                 OJG1F405.119    
*ENDIF                                                                     ORH5F403.262    
      return                                                               ICEDRIFT.453    
      end                                                                  ICEDRIFT.454    
*ENDIF                                                                     ICEDRIFT.455