*IF DEF,SEAICE                                                             ORH1F305.445    
C ******************************COPYRIGHT******************************    GTS2F400.4267   
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved.    GTS2F400.4268   
C                                                                          GTS2F400.4269   
C Use, duplication or disclosure of this code is subject to the            GTS2F400.4270   
C restrictions as set forth in the contract.                               GTS2F400.4271   
C                                                                          GTS2F400.4272   
C                Meteorological Office                                     GTS2F400.4273   
C                London Road                                               GTS2F400.4274   
C                BRACKNELL                                                 GTS2F400.4275   
C                Berkshire UK                                              GTS2F400.4276   
C                RG12 2SZ                                                  GTS2F400.4277   
C                                                                          GTS2F400.4278   
C If no contract has been raised with this copy of the code, the use,      GTS2F400.4279   
C duplication or disclosure of it is strictly prohibited.  Permission      GTS2F400.4280   
C to do so must first be obtained in writing from the Head of Numerical    GTS2F400.4281   
C Modelling at the above address.                                          GTS2F400.4282   
C ******************************COPYRIGHT******************************    GTS2F400.4283   
C                                                                          GTS2F400.4284   
C*LL                                                                       ICEADVEC.4      
CLL   SUBROUTINE ICE_ADVECT                                                ICEADVEC.5      
CLL   -------------------                                                  ICEADVEC.6      
CLL                                                                        ICEADVEC.7      
CLL   DYNAMIC SEA ICE MODEL SUBROUTINE TO ADVECT ICE THICKNESS,            ICEADVEC.8      
CLL   COMPACTNESS AND SNOW DEPTH ON ARAKAWA C GRID USING UPSTREAM          ICEADVEC.9      
CLL   DIFFERENCING.                                                        ICEADVEC.10     
CLL                                                                        ICEADVEC.11     
CLL   IT CAN BE COMPILED BY CFT77, BUT DOES NOT CONFORM TO ANSI            ICEADVEC.12     
CLL   FORTRAN77 STANDARDS, BECAUSE OF THE INLINE COMMENTS.                 ICEADVEC.13     
CLL                                                                        ICEADVEC.14     
CLL   ALL QUANTITIES IN THIS ROUTINE ARE IN S.I. UNITS UNLESS              ICEADVEC.15     
CLL   OTHERWISE STATED.                                                    ICEADVEC.16     
CLL                                                                        ICEADVEC.17     
CLL   15/09/93 Advection scheme now conserves ice mass taking full         ICEADVEC.18     
CLL   account of spherical geometry. JFT                                   ICEADVEC.19     
CLL   Modified 08/10/93 T.C.Johns                                          ICEADVEC.20     
CLL            Converted to nupdate format for compatibility with vn3.2.   ICEADVEC.21     
CLL                                                                        ICEADVEC.22     
CLL   WRITTEN BY J.F.THOMSON (18/02/93)                                    ICEADVEC.23     
CLL                                                                        ICEADVEC.24     
CLL  MODEL            MODIFICATION HISTORY FROM INSERTION INTO UM 3.3:     ICEADVEC.25     
CLL VERSION  DATE                                                          ICEADVEC.26     
!     3.5    16.01.95   Remove *IF dependency. R.Hill                      ORH1F305.4750   
!      4.3    01.02.97   Include further SWAPBOUNDS for mpp. R.Hill        ORH3F403.60     
CLL                                                                        ICEADVEC.27     
CLL   THIS ROUTINE FORMS PART OF SYSTEM COMPONENT P4.                      ICEADVEC.28     
CLL   ADHERES TO THE STANDARDS OF DOCUMENTATION PAPER 4, VERSION 1.        ICEADVEC.29     
CLLEND---------------------------------------------------------------      ICEADVEC.30     
C*L                                                                        ICEADVEC.31     

      subroutine ice_advect(                                                1,7ICEADVEC.32     
*CALL ARGOINDX                                                             ORH7F402.237    
     & uice                                                                ICEADVEC.33     
     &,vice                                                                ICEADVEC.34     
     &,aice                                                                ICEADVEC.35     
     &,hice                                                                ICEADVEC.36     
     &,hsnow                                                               ICEADVEC.37     
     &,hmask                                                               ICEADVEC.38     
     &,umask                                                               ICEADVEC.39     
     &,icy                                                                 ICEADVEC.40     
     &,imt,imtm2,jmt,jmtm1                                                 ORH3F405.98     
     &,phi                                                                 ICEADVEC.42     
     &,phit                                                                ICEADVEC.43     
     &,dphi                                                                ICEADVEC.44     
     &,dlambda                                                             ICEADVEC.45     
     &,radius                                                              ICEADVEC.46     
     &,dtts                                                                ICEADVEC.47     
     & )                                                                   ICEADVEC.48     
C                                                                          ICEADVEC.49     
      implicit none                                                        ICEADVEC.50     
C                                                                          ICEADVEC.51     
*CALL OTIMER                                                               ORH1F305.4751   
*CALL TYPOINDX                                                             ORH7F402.238    
      integer                                                              ICEADVEC.52     
     & imt            ! number of tracer columns.                          ICEADVEC.53     
     &,imtm2          ! number of tracer columns - 2                       ORH6F402.109    
     &,jmt            ! number of tracer rows.                             ICEADVEC.54     
     &,jmtm1          ! number of velocity rows.                           ICEADVEC.55     
      real                                                                 ICEADVEC.56     
     & uice(imt,jmtm1)  ! in    zonal sea ice velocity.                    ICEADVEC.57     
     &,vice(imt,jmtm1)  ! in    meridional sea ice velocity.               ICEADVEC.58     
     &,phi(jmt)         ! in    latitude of uv rows in radians.            ICEADVEC.59     
     &,phit(jmt)        ! in    latitude of mass rows in radians.          ICEADVEC.60     
     &,aice(imt,jmt)    ! inout ice compactness.                           ICEADVEC.61     
     &,hice(imt,jmt)    ! inout ice thickness.                             ICEADVEC.62     
     &,hsnow(imt,jmt)   ! inout snow depth.                                ICEADVEC.63     
      real                                                                 ICEADVEC.64     
     & radius           ! in radius of the earth in metres.                ICEADVEC.65     
     &,dphi(jmt)        ! in meridional grid spacing in radians.           ICEADVEC.66     
     &,dlambda(imt)     ! in zonal grid spacing in radians.                ICEADVEC.67     
     &,dtts             ! in timestep in seconds.                          ICEADVEC.68     
      real                                                                 ICEADVEC.69     
     & hmask(imt,jmt)   ! in 1.0 for ha land 0.0 for sea.                  ICEADVEC.70     
     &,umask(imt,jmtm1) ! in 1.0 for uv land 0.0 for sea.                  ICEADVEC.71     
      logical                                                              ICEADVEC.72     
     & icy(imt,jmt)     ! in true if ice is present.                       ICEADVEC.73     
C                                                                          ICEADVEC.74     
C variables local to this subroutine are now defined                       ICEADVEC.75     
C                                                                          ICEADVEC.76     
      real                                                                 ICEADVEC.77     
     & hice_init(imt,jmt) ! initial ice thickness.                         ICEADVEC.78     
     &,aice_init(imt,jmt) ! initial ice compactness.                       ICEADVEC.79     
     &,hsno_init(imt,jmt) ! initial snow depth.                            ICEADVEC.80     
     &,uwork(imt,jmtm1),vwork(imt,jmtm1)                                   ICEADVEC.81     
      real                                                                 ICEADVEC.82     
     & um,vm,ump,vmp                                                       ICEADVEC.83     
     &,qinx,qinxp,qiny,qinyp                                               ICEADVEC.84     
     &,qax,qaxp,qay,qayp                                                   ICEADVEC.85     
     &,qsx,qsxp,qsy,qsyp                                                   ICEADVEC.86     
     &,qijh,qija,qijs                                                      ICEADVEC.87     
     &,area,facey,faceyp,facex,facexp                                      ICEADVEC.88     
C                                                                          ICEADVEC.89     
      logical                                                              ICEADVEC.90     
     & lcheck                                                              ICEADVEC.91     
C                                                                          ICEADVEC.92     
      integer                                                              ICEADVEC.93     
     & i                                                                   ORH6F402.111    
     &,j                                                                   ICEADVEC.98     
C*                                                                         ICEADVEC.99     
! start executable code                                                    ORH9F402.207    
                                                                           ORH9F402.208    
      if (L_OTIMER) call timer('iceadvec',3)                               ORH1F305.4752   
C                                                                          ICEADVEC.108    
*IF DEF,MPP                                                                ORH4F402.135    
C=====================================================================     ORH4F402.136    
C CALL TO SWAPBOUNDS FOR HALO UPDATE IN MPP VERSION                        ORH4F402.137    
C=====================================================================     ORH4F402.138    
                                                                           ORH4F402.139    
      CALL SWAPBOUNDS(UICE,IMT,JMTM1,O_EW_HALO,O_NS_HALO,1)                ORH3F403.61     
      CALL SWAPBOUNDS(VICE,IMT,JMTM1,O_EW_HALO,O_NS_HALO,1)                ORH3F403.62     
                                                                           ORH3F403.63     
                                                                           ORH4F402.143    
*ENDIF                                                                     ORH4F402.144    
                                                                           ORH4F402.145    
C Copy initial ice thickness, compactness and snow depth to workspace      ICEADVEC.109    
C                                                                          ICEADVEC.110    
      do j=J_1,J_jmt                                                       ORH9F402.209    
        do i=1,imt                                                         ICEADVEC.112    
          hice_init(i,j) = hice(i,j)                                       ICEADVEC.113    
          aice_init(i,j) = aice(i,j)                                       ICEADVEC.114    
          hsno_init(i,j) = hsnow(i,j)                                      ICEADVEC.115    
        end do                                                             ICEADVEC.116    
      end do                                                               ICEADVEC.117    
*IF DEF,MPP                                                                ORH4F402.100    
C=====================================================================     ORH4F402.101    
C CALL TO SWAPBOUNDS FOR HALO UPDATE IN MPP VERSION                        ORH4F402.102    
C=====================================================================     ORH4F402.103    
                                                                           ORH4F402.104    
      CALL SWAPBOUNDS(HICE_INIT,IMT,JMT,O_EW_HALO,O_NS_HALO,1)             ORH4F402.105    
                                                                           ORH4F402.106    
      CALL SWAPBOUNDS(AICE_INIT,IMT,JMT,O_EW_HALO,O_NS_HALO,1)             ORH4F402.107    
                                                                           ORH4F402.108    
      CALL SWAPBOUNDS(HSNO_INIT,IMT,JMT,O_EW_HALO,O_NS_HALO,1)             ORH4F402.109    
                                                                           ORH4F402.110    
*ENDIF                                                                     ORH4F402.111    
                                                                           ORH4F402.112    
C                                                                          ICEADVEC.118    
C Loop over grid advecting primary variables.                              ICEADVEC.119    
C                                                                          ICEADVEC.120    
                                                                           ORH9F402.210    
      ! Changed the following loop from j=1,jmtm2                          ORH9F402.211    
      ! to j=2,jmtm1 to avoid referencing variables outside                ORH9F402.212    
      ! halo regions in MPP code. Hence all refs to                        ORH9F402.213    
      ! j+1 become j, j+2 becomes j+1 and j becomes j-1                    ORH9F402.214    
      do j=J_2,J_jmtm1                                                     ORH9F402.215    
        do i=1,imtm2                                                       ICEADVEC.122    
          lcheck = (icy(i,j).or.icy(i+1,j).or.icy(i+1,j-1)                 ORH9F402.216    
     &              .or.icy(i+1,j+1).or.icy(i+2,j))                        ORH9F402.217    
          if ( hmask(i+1,j).gt.0.1 .and. lcheck ) then                     ORH9F402.218    
C                                                                          ICEADVEC.126    
            area =radius**2*dlambda(i+1)*(sin(phi(j))-sin(phi(j-1)))       ORH9F402.219    
            facex=radius*dphi(j)                                           ORH9F402.220    
            facexp = facex                                                 ICEADVEC.129    
            facey  = radius*cos(phi(j-1))*dlambda(i+1)                     ORH9F402.221    
            faceyp = radius*cos(phi(j))*dlambda(i+1)                       ORH9F402.222    
C                                                                          ICEADVEC.132    
            um  = uice(i,j-1)                                              ORH9F402.223    
            vm  = vice(i,j-1)                                              ORH9F402.224    
            ump = uice(i+1,j-1)                                            ORH9F402.225    
            vmp = vice(i,j)                                                ORH9F402.226    
C                                                                          ICEADVEC.137    
            if (um.ge.0.)  qinx  = um*hice_init(i,j)*hmask(i,j)            ORH9F402.227    
            if (um.lt.0.)  qinx  = um*hice_init(i+1,j)*hmask(i+1,j)        ORH9F402.228    
            if (vm.ge.0.)  qiny  = vm*hice_init(i+1,j-1)*hmask(i+1,j-1)    ORH9F402.229    
            if (vm.lt.0.)  qiny  = vm*hice_init(i+1,j)*hmask(i+1,j)        ORH9F402.230    
            if (ump.ge.0.) qinxp=-ump*hice_init(i+1,j)*hmask(i+1,j)        ORH9F402.231    
            if (ump.lt.0.) qinxp=-ump*hice_init(i+2,j)*hmask(i+2,j)        ORH9F402.232    
            if (vmp.ge.0.) qinyp=-vmp*hice_init(i+1,j)*hmask(i+1,j)        ORH9F402.233    
            if (vmp.lt.0.) qinyp=-vmp*hice_init(i+1,j+1)*hmask(i+1,j+1)    ORH9F402.234    
C                                                                          ICEADVEC.146    
            if (um.ge.0.)  qax  = um*aice_init(i,j)*hmask(i,j)             ORH9F402.235    
            if (um.lt.0.)  qax  = um*aice_init(i+1,j)*hmask(i+1,j)         ORH9F402.236    
            if (vm.ge.0.)  qay  = vm*aice_init(i+1,j-1)*hmask(i+1,j-1)     ORH9F402.237    
            if (vm.lt.0.)  qay  = vm*aice_init(i+1,j)*hmask(i+1,j)         ORH9F402.238    
            if (ump.ge.0.) qaxp =-ump*aice_init(i+1,j)*hmask(i+1,j)        ORH9F402.239    
            if (ump.lt.0.) qaxp =-ump*aice_init(i+2,j)*hmask(i+2,j)        ORH9F402.240    
            if (vmp.ge.0.) qayp =-vmp*aice_init(i+1,j)*hmask(i+1,j)        ORH9F402.241    
            if (vmp.lt.0.) qayp =-vmp*aice_init(i+1,j+1)*hmask(i+1,j+1)    ORH9F402.242    
C                                                                          ICEADVEC.155    
            if (um.ge.0.)  qsx  = qax*hsno_init(i,j)                       ORH9F402.243    
            if (um.lt.0.)  qsx  = qax*hsno_init(i+1,j)                     ORH9F402.244    
            if (vm.ge.0.)  qsy  = qay*hsno_init(i+1,j-1)                   ORH9F402.245    
            if (vm.lt.0.)  qsy  = qay*hsno_init(i+1,j)                     ORH9F402.246    
            if (ump.ge.0.) qsxp = qaxp*hsno_init(i+1,j)                    ORH9F402.247    
            if (ump.lt.0.) qsxp = qaxp*hsno_init(i+2,j)                    ORH9F402.248    
            if (vmp.ge.0.) qsyp = qayp*hsno_init(i+1,j)                    ORH9F402.249    
            if (vmp.lt.0.) qsyp = qayp*hsno_init(i+1,j+1)                  ORH9F402.250    
C                                                                          ICEADVEC.164    
            qijh = hice(i+1,j)*hmask(i+1,j)                                ORH9F402.251    
            qija = aice(i+1,j)*hmask(i+1,j)                                ORH9F402.252    
            qijs = hsnow(i+1,j)*qija                                       ORH9F402.253    
C                                                                          ICEADVEC.168    
       hice(i+1,j) = qijh + ( qinx*facex + qinxp*facexp + qiny*facey       ORH9F402.254    
     &      + qinyp*faceyp ) * dtts/area                                   ICEADVEC.170    
       aice(i+1,j) = qija + ( qax*facex + qaxp*facexp + qay*facey          ORH9F402.255    
     &      + qayp*faceyp ) * dtts/area                                    ICEADVEC.172    
       if (aice(i+1,j).gt.0.0)                                             ORH9F402.256    
     & hsnow(i+1,j)= ( qijs + ( qsx*facex + qsxp*facexp + qsy*facey        ORH9F402.257    
     &      + qsyp*faceyp ) * dtts/area )/aice(i+1,j)                      ORH9F402.258    
C                                                                          ICEADVEC.176    
          endif                                                            ICEADVEC.177    
        end do                                                             ICEADVEC.178    
      end do                                                               ICEADVEC.179    
!                                                                          ORH9F402.259    
*IF DEF,MPP                                                                ORH9F402.260    
      IF (JFIN.GE.JMT_GLOBAL.AND.JST.LE.JMT_GLOBAL) THEN                   ORH9F402.261    
*ENDIF                                                                     ORH9F402.262    
                                                                           ORH9F402.263    
! Special code for row JMT_GLOBAL                                          ORH9F402.264    
!                                                                          ORH9F402.265    
      j = J_jmt                                                            ORH9F402.266    
      do i=1,imtm2                                                         ORH9F402.267    
        lcheck = (icy(i,j).or.icy(i+1,j).or.icy(i+1,j-1)                   ORH9F402.268    
     &            .or.icy(i+2,j))                                          ORH9F402.269    
        if (hmask(i+1,j).gt.0.1 .and. lcheck) then                         ORH9F402.270    
C                                                                          ICEADVEC.180    
            area=radius**2*dlambda(i+1)*(sin(phi(j))-sin(phi(j-1)))        ORH9F402.271    
            facex  = radius*dphi(j)                                        ORH9F402.272    
            facexp = facex                                                 ICEADVEC.191    
            facey  = radius*cos(phi(j-1))*dlambda(i+1)                     ORH9F402.273    
C                                                                          ICEADVEC.193    
          um  = uice(i,j-1)                                                ORH9F402.274    
          vm  = vice(i,j-1)                                                ORH9F402.275    
          ump = uice(i+1,j-1)                                              ORH9F402.276    
          vmp = 0.                                                         ICEADVEC.197    
C                                                                          ICEADVEC.198    
          if (um.ge.0.)  qinx  = um*hice_init(i,j)*hmask(i,j)              ORH9F402.277    
          if (um.lt.0.)  qinx  = um*hice_init(i+1,j)*hmask(i+1,j)          ORH9F402.278    
          if (vm.ge.0.)  qiny  = vm*hice_init(i+1,j-1)*hmask(i+1,j-1)      ORH9F402.279    
          if (vm.lt.0.)  qiny  = vm*hice_init(i+1,j)*hmask(i+1,j)          ORH9F402.280    
          if (ump.ge.0.) qinxp =-ump*hice_init(i+1,j)*hmask(i+1,j)         ORH9F402.281    
          if (ump.lt.0.) qinxp =-ump*hice_init(i+2,j)*hmask(i+2,j)         ORH9F402.282    
          qinyp = 0.                                                       ICEADVEC.205    
C                                                                          ICEADVEC.206    
          if (um.ge.0.)  qax  = um*aice_init(i,j)*hmask(i,j)               ORH9F402.283    
          if (um.lt.0.)  qax  = um*aice_init(i+1,j)*hmask(i+1,j)           ORH9F402.284    
          if (vm.ge.0.)  qay  = vm*aice_init(i+1,j-1)*hmask(i+1,j-1)       ORH9F402.285    
          if (vm.lt.0.)  qay  = vm*aice_init(i+1,j)*hmask(i+1,j)           ORH9F402.286    
          if (ump.ge.0.) qaxp =-ump*aice_init(i+1,j)*hmask(i+1,j)          ORH9F402.287    
          if (ump.lt.0.) qaxp =-ump*aice_init(i+2,j)*hmask(i+2,j)          ORH9F402.288    
          qayp = 0.0                                                       ICEADVEC.213    
C                                                                          ICEADVEC.214    
          if (um.ge.0.)    qsx  = qax*hsno_init(i,j)                       ORH9F402.289    
          if (um.lt.0.)    qsx  = qax*hsno_init(i+1,j)                     ORH9F402.290    
          if (vm.ge.0.)    qsy  = qay*hsno_init(i+1,j-1)                   ORH9F402.291    
          if (vm.lt.0.)    qsy  = qay*hsno_init(i+1,j)                     ORH9F402.292    
          if (ump.ge.0.) qsxp = qaxp*hsno_init(i+1,j)                      ORH9F402.293    
          if (ump.lt.0.) qsxp = qaxp*hsno_init(i+2,j)                      ORH9F402.294    
          qsyp = 0.                                                        ICEADVEC.221    
C                                                                          ICEADVEC.222    
          qijh = hice(i+1,j)*hmask(i+1,j)                                  ORH9F402.295    
          qija = aice(i+1,j)*hmask(i+1,j)                                  ORH9F402.296    
          qijs = hsnow(i+1,j)*qija                                         ORH9F402.297    
C                                                                          ICEADVEC.226    
       hice(i+1,j) = qijh + ( qinx*facex + qinxp*facexp + qiny*facey )     ORH9F402.298    
     &       * dtts/area                                                   ICEADVEC.228    
       aice(i+1,j) = qija + ( qax*facex + qaxp*facexp + qay*facey )        ORH9F402.299    
     &       * dtts/area                                                   ICEADVEC.230    
       hsnow(i+1,j)= ( qijs + ( qsx*facex + qsxp*facexp + qsy*facey )      ORH9F402.300    
     &       * dtts/area )/aice(i+1,j)                                     ORH9F402.301    
        endif                                                              ICEADVEC.233    
      end do                                                               ICEADVEC.234    
*IF DEF,MPP                                                                ORH9F402.302    
      ENDIF ! If this PE deals with row JMT_GLOBAL                         ORH9F402.303    
*ENDIF                                                                     ORH9F402.304    
                                                                           ORH9F402.305    
C                                                                          ICEADVEC.237    
      if (L_OTIMER) call timer('iceadvec',4)                               ORH1F305.4753   
      return                                                               ICEADVEC.241    
      end                                                                  ICEADVEC.242    
*ENDIF                                                                     ICEADVEC.243