*IF DEF,SEAICE                                                             ICEUPDT.2      
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved.    GTS2F400.15082  
C                                                                          GTS2F400.15083  
C Use, duplication or disclosure of this code is subject to the            GTS2F400.15084  
C restrictions as set forth in the contract.                               GTS2F400.15085  
C                                                                          GTS2F400.15086  
C                Meteorological Office                                     GTS2F400.15087  
C                London Road                                               GTS2F400.15088  
C                BRACKNELL                                                 GTS2F400.15089  
C                Berkshire UK                                              GTS2F400.15090  
C                RG12 2SZ                                                  GTS2F400.15091  
C                                                                          GTS2F400.15092  
C If no contract has been raised with this copy of the code, the use,      GTS2F400.15093  
C duplication or disclosure of it is strictly prohibited.  Permission      GTS2F400.15094  
C to do so must first be obtained in writing from the Head of Numerical    GTS2F400.15095  
C Modelling at the above address.                                          GTS2F400.15096  
C ******************************COPYRIGHT******************************    GTS2F400.15097  
C                                                                          GTS2F400.15098  
!+ Update ice prognostics: aice and hice and dependant logical: icy        ICEUPDT.3      
!                                                                          ICEUPDT.4      
! Subroutine Interface:                                                    ICEUPDT.5      

      SUBROUTINE ice_update_ice(                                            1ICEUPDT.6      
*CALL ARGOINDX                                                             ORH7F402.255    
     & imt,jmt                                                             ICEUPDT.7      
     &,delh,dela,newice                                                    ICEUPDT.8      
     &,hice,aice,icy                                                       ICEUPDT.9      
     & )                                                                   ICEUPDT.10     
                                                                           ICEUPDT.11     
      IMPLICIT NONE                                                        ICEUPDT.12     
!                                                                          ICEUPDT.13     
! Description:                                                             ICEUPDT.14     
!   Updates ice depth and concentration by the corresponding               ICEUPDT.15     
! increments. Updates 'icy' - now also true if new ice is forming          ICEUPDT.16     
! this time step.                                                          ICEUPDT.17     
!                                                                          ICEUPDT.18     
! Method:                                                                  ICEUPDT.19     
!   Straight forward nested do loops.                                      ICEUPDT.20     
!                                                                          ICEUPDT.21     
! Current Code Owner: Steve Foreman                                        ICEUPDT.22     
!                                                                          ICEUPDT.23     
! History:                                                                 ICEUPDT.24     
! Version   Date     Comment                                               ICEUPDT.25     
! -------   ----     -------                                               ICEUPDT.26     
! pre 4.0            Part of subroutine ICEFLOE                            ICEUPDT.27     
! 4.0       15.6.95  Code separated by Chris Sherlock                      ICEUPDT.28     
!                                                                          ICEUPDT.29     
! Code Description:                                                        ICEUPDT.30     
!   Language: FORTRAN 77 + common extensions.                              ICEUPDT.31     
!   This code is written to UMDP3 v6 programming standards.                ICEUPDT.32     
!                                                                          ICEUPDT.33     
! System component covered:  P4                                            ICEUPDT.34     
! System Task:                                                             ICEUPDT.35     
!                                                                          ICEUPDT.36     
! Declarations:                                                            ICEUPDT.37     
!   These are of the form:-                                                ICEUPDT.38     
!     INTEGER      ExampleVariable      !Description of variable           ICEUPDT.39     
!                                                                          ICEUPDT.40     
! Global variables (*CALLed COMDECKs etc...):                              ICEUPDT.41     
!   NONE                                                                   ICEUPDT.42     
!                                                                          ORH3F402.226    
! Subroutine arguments                                                     ICEUPDT.43     
*CALL TYPOINDX                                                             ORH7F402.256    
!   Scalar arguments with intent(in):                                      ICEUPDT.44     
      INTEGER imt      ! IN row size                                       ICEUPDT.45     
      INTEGER jmt      ! IN column size                                    ICEUPDT.46     
                                                                           ICEUPDT.47     
!   Array  arguments with intent(in):                                      ICEUPDT.48     
      REAL delh(imt,jmt)      ! IN ice depth increment                     ICEUPDT.49     
      REAL dela(imt,jmt)      ! IN ice conc. increment                     ICEUPDT.50     
      LOGICAL newice(imt,jmt) ! IN t if fresh ice is forming               ICEUPDT.51     
                                                                           ICEUPDT.52     
!   Scalar arguments with intent(InOut):                                   ICEUPDT.53     
                                                                           ICEUPDT.54     
!   Array  arguments with intent(InOut):                                   ICEUPDT.55     
      REAL hice(imt,jmt)     ! INOUT effective ice depth                   ICEUPDT.56     
      REAL aice(imt,jmt)     ! INOUT ice concentration                     ICEUPDT.57     
      LOGICAL icy(imt,jmt)   ! INOUT true if ice in grid box               ICEUPDT.58     
                                                                           ICEUPDT.59     
!   Scalar arguments with intent(out):                                     ICEUPDT.60     
                                                                           ICEUPDT.61     
!   Array  arguments with intent(out):                                     ICEUPDT.62     
                                                                           ICEUPDT.63     
! Local parameters:                                                        ICEUPDT.64     
                                                                           ICEUPDT.65     
! Local scalars:                                                           ICEUPDT.66     
      INTEGER i,j      ! loop counters                                     ICEUPDT.67     
                                                                           ICEUPDT.68     
! Local dynamic arrays:                                                    ICEUPDT.69     
                                                                           ICEUPDT.70     
! Function & Subroutine calls:                                             ICEUPDT.71     
                                                                           ICEUPDT.72     
!- End of header                                                           ICEUPDT.73     
                                                                           ICEUPDT.74     
      DO j = J_1,J_jmt                                                     ORH3F402.227    
      DO i=1,imt                                                           ICEUPDT.76     
        ICY(I,J) = ICY(I,J) .OR. NEWICE(I,J)                               ICEUPDT.77     
        IF ( ICY(I,J) ) THEN                                               ICEUPDT.78     
          HICE(I,J) = HICE(I,J) + DELH(I,J)                                ICEUPDT.79     
          AICE(I,J) = AICE(I,J) + DELA(I,J)                                ICEUPDT.80     
        ENDIF                                                              ICEUPDT.81     
      ENDDO                                                                ICEUPDT.82     
      ENDDO                                                                ICEUPDT.83     
c                                                                          ICEUPDT.84     
      RETURN                                                               ICEUPDT.85     
      END                                                                  ICEUPDT.86     
                                                                           ICEUPDT.87     
!+ Update ocean variables: caryheat and carysalt                           ICEUPDT.88     
!                                                                          ICEUPDT.89     
! Subroutine Interface:                                                    ICEUPDT.90     

      SUBROUTINE ice_update_ocean(                                          1ICEUPDT.91     
*CALL ARGOINDX                                                             ORH7F402.257    
     & imt,jmt                                                             ICEUPDT.92     
     &,qsbydt,salice,const1,const2,const4                                  ICEUPDT.93     
     &,surfsal,sublim,newice                                               ICEUPDT.94     
     &,hsnow,delh,dela                                                     ICEUPDT.95     
     &,caryheat,carysalt,snowmelt                                          ICEUPDT.96     
     &,icy                                                                 ICEUPDT.97     
     &, salref)                                                            OJL1F405.56     
                                                                           ICEUPDT.99     
      IMPLICIT NONE                                                        ICEUPDT.100    
!                                                                          ICEUPDT.101    
! Description:                                                             ICEUPDT.102    
!                                                                          ICEUPDT.103    
!                                                                          ICEUPDT.104    
! Method:                                                                  ICEUPDT.105    
!   Straight forward 'if test' within nested do loops.                     ICEUPDT.106    
!                                                                          ICEUPDT.107    
! Current Code Owner: Steve Foreman                                        ICEUPDT.108    
!                                                                          ICEUPDT.109    
! History:                                                                 ICEUPDT.110    
! Version   Date     Comment                                               ICEUPDT.111    
! -------   ----     -------                                               ICEUPDT.112    
! pre 4.0            Part of subroutine ICEFLOE                            ICEUPDT.113    
! 4.0       15.6.95  Code separated by Chris Sherlock                      ICEUPDT.114    
!                                                                          ICEUPDT.115    
! Code Description:                                                        ICEUPDT.116    
!   Language: FORTRAN 77 + common extensions.                              ICEUPDT.117    
!   This code is written to UMDP3 v6 programming standards.                ICEUPDT.118    
!                                                                          ICEUPDT.119    
! System component covered:  P4                                            ICEUPDT.120    
! System Task:                                                             ICEUPDT.121    
!                                                                          ICEUPDT.122    
! Declarations:                                                            ICEUPDT.123    
!   These are of the form:-                                                ICEUPDT.124    
!     INTEGER      ExampleVariable      !Description of variable           ICEUPDT.125    
!                                                                          ICEUPDT.126    
! Global variables (*CALLed COMDECKs etc...):                              ICEUPDT.127    
!   NONE                                                                   ICEUPDT.128    
! Subroutine arguments                                                     ICEUPDT.129    
*CALL CNTLOCN                                                              OJL1F405.58     
*CALL TYPOINDX                                                             ORH7F402.258    
!   Scalar arguments with intent(in):                                      ICEUPDT.130    
!                                                                          ORH3F402.228    
      INTEGER imt      ! IN row size                                       ICEUPDT.131    
      INTEGER jmt      ! IN column size                                    ICEUPDT.132    
      REAL    qsbydt   ! IN volumetric heat of fusion (ocn) / time step    ICEUPDT.133    
      REAL    salice   ! IN reference salinity for ice                     ICEUPDT.134    
      REAL    const1   ! IN rhoice/rhowater / depth of ocean level 1       ICEUPDT.135    
      REAL    const2   ! IN rhosno/rhowater / depth of ocean level 1       ICEUPDT.136    
      REAL    const4   ! IN timestep / (rhowater * " " " " " " " " ")      ICEUPDT.137    
        real salref                                                        OJL1F405.57     
                                                                           ICEUPDT.138    
!   Array  arguments with intent(in):                                      ICEUPDT.139    
      REAL surfsal(imt,jmt)   ! IN salinity of top ocean level             ICEUPDT.140    
      REAL sublim(imt,jmt)    ! IN rate of sublimation kg m-2 s-1          ICEUPDT.141    
      LOGICAL newice(imt,jmt) ! IN t if ice is just starting to form       ICEUPDT.142    
                                                                           ICEUPDT.143    
!   Scalar arguments with intent(InOut):                                   ICEUPDT.144    
                                                                           ICEUPDT.145    
!   Array  arguments with intent(InOut):                                   ICEUPDT.146    
      REAL hsnow(imt,jmt)    ! INOUT snow depth over ice                   ICEUPDT.147    
      REAL delh(imt,jmt)     ! INOUT ice depth increment                   ICEUPDT.148    
      REAL dela(imt,jmt)     ! INOUT ice conc. increment                   ICEUPDT.149    
      REAL caryheat(imt,jmt) ! INOUT misc. heat ice <==> ocean             ICEUPDT.150    
      REAL carysalt(imt,jmt) ! INOUT salinity flux ice => ocean            ICEUPDT.151    
      REAL snowmelt(imt,jmt) ! INOUT keeps track of snow that melts        ICEUPDT.152    
                             !   during a time step for contrib. to        ICEUPDT.153    
                             !   carysalt.                                 ICEUPDT.154    
      LOGICAL icy(imt,jmt)   ! INOUT true if ice in grid box               ICEUPDT.155    
                                                                           ICEUPDT.156    
!   Scalar arguments with intent(out):                                     ICEUPDT.157    
                                                                           ICEUPDT.158    
!   Array  arguments with intent(out):                                     ICEUPDT.159    
                                                                           ICEUPDT.160    
! Local parameters:                                                        ICEUPDT.161    
                                                                           ICEUPDT.162    
! Local scalars:                                                           ICEUPDT.163    
      INTEGER i,j      ! loop counters                                     ICEUPDT.164    
                                                                           ICEUPDT.165    
! Local dynamic arrays:                                                    ICEUPDT.166    
                                                                           ICEUPDT.167    
! Function & Subroutine calls:                                             ICEUPDT.168    
                                                                           ICEUPDT.169    
!- End of header                                                           ICEUPDT.170    
!---------------------------------------------------------                 ICEUPDT.171    
      DO j = J_1,J_jmt                                                     ORH3F402.229    
      DO i=1,imt                                                           ICEUPDT.173    
                                                                           ICEUPDT.174    
!     COMPUTE THE ICE CONTRIBUTION TO CARYSALT FOR ALL POINTS EXCEPT       ICEUPDT.175    
!     NEWLY-MELTED ONES. SUBLIMATION INCREASES SALINITY,AS THE SALT        ICEUPDT.176    
!     LEFT BEHIND IS ASSUMED TO BLOW INTO THE LEADS.                       ICEUPDT.177    
                                                                           ICEUPDT.178    
        IF ( ICY(I,J) ) THEN                                               ICEUPDT.179    
       if (L_REFSAL) then                                                  OJL1F405.59     
         CARYSALT(I,J) = carysalt(i,j)                                     OJL1F405.60     
     &   +CONST1*(salref-SALICE )*DELH(I,J)                                OJL1F405.61     
     &   +CONST4*SUBLIM(I,J)*salref                                        OJL1F405.62     
       else                                                                OJL1F405.63     
         CARYSALT(I,J) = carysalt(i,j)                                     OJL1F405.64     
     &   + CONST1*( SURFSAL(I,J) - SALICE )*DELH(I,J)                      OJL1F405.65     
     &   + CONST4*SUBLIM(I,J)*SURFSAL(I,J)                                 OJL1F405.66     
       endif                                                               OJL1F405.67     
        ENDIF                                                              ICEUPDT.183    
                                                                           ICEUPDT.184    
!     NOW,FOR BOXES WHICH (A) HAVE BEEN ICY THROUGHOUT THE STEP,AND        ICEUPDT.185    
!     (B) HAVE A REDUCED ICE AREA: STORE THE HEAT NEEDED TO MELT THE       ICEUPDT.186    
!     SNOW THAT HAS 'FALLEN IN', FOR COOLING THE OCEAN NEXT STEP.          ICEUPDT.187    
!     ALSO MAKE A SIMILAR ADJUSTMENT TO SNOWMELT.                          ICEUPDT.188    
                                                                           ICEUPDT.189    
        IF ( ICY(I,J) .AND. DELA(I,J) .LT. 0.0 ) THEN                      ICEUPDT.190    
          SNOWMELT(I,J) = SNOWMELT(I,J) - HSNOW(I,J)*DELA(I,J)             ICEUPDT.191    
          CARYHEAT(I,J) = caryheat(i,j)                                    ICEUPDT.192    
     &                  + QSBYDT*HSNOW(I,J)*DELA(I,J)                      ICEUPDT.193    
        ENDIF                                                              ICEUPDT.194    
                                                                           ICEUPDT.195    
!     ADD IN THE SNOW CONTRIBUTION TO CARYSALT.                            ICEUPDT.196    
                                                                           ICEUPDT.197    
        IF ( ICY(I,J) ) THEN                                               ICEUPDT.198    
       if (L_REFSAL) then                                                  OJL1F405.68     
          SNOWMELT(I,J)=CONST2*SNOWMELT(I,J)*salref                        OJL1F405.69     
       else                                                                OJL1F405.70     
          SNOWMELT(I,J) = CONST2*SNOWMELT(I,J)*SURFSAL(I,J)                OJL1F405.71     
       endif                                                               OJL1F405.72     
          CARYSALT(I,J) = CARYSALT(I,J) - SNOWMELT(I,J)                    ICEUPDT.200    
        ENDIF                                                              ICEUPDT.201    
                                                                           ICEUPDT.202    
      ENDDO                                                                ICEUPDT.203    
      ENDDO                                                                ICEUPDT.204    
                                                                           ICEUPDT.205    
      RETURN                                                               ICEUPDT.206    
      END                                                                  ICEUPDT.207    
!+ Update snow depth                                                       ICEUPDT.208    
!                                                                          ICEUPDT.209    
! Subroutine Interface:                                                    ICEUPDT.210    

      SUBROUTINE ice_update_snow(                                           1ICEUPDT.211    
*CALL ARGOINDX                                                             ORH7F402.259    
     & imt,jmt                                                             ICEUPDT.212    
     &,aice,dela                                                           ICEUPDT.213    
     &,hsnow                                                               ICEUPDT.214    
     & )                                                                   ICEUPDT.215    
                                                                           ICEUPDT.216    
      IMPLICIT NONE                                                        ICEUPDT.217    
!                                                                          ICEUPDT.218    
! Description:                                                             ICEUPDT.219    
!   Updates snow depth when ice fraction has increased, so as to           ICEUPDT.220    
! conserve the total mass of snow.                                         ICEUPDT.221    
!                                                                          ICEUPDT.222    
! Method:                                                                  ICEUPDT.223    
!   Straight forward nested do loops.                                      ICEUPDT.224    
!                                                                          ICEUPDT.225    
! Current Code Owner: Steve Foreman                                        ICEUPDT.226    
!                                                                          ICEUPDT.227    
! History:                                                                 ICEUPDT.228    
! Version   Date     Comment                                               ICEUPDT.229    
! -------   ----     -------                                               ICEUPDT.230    
! pre 4.0            Part of subroutine ICEFLOE                            ICEUPDT.231    
! 4.0       15.6.95  Code separated by Chris Sherlock                      ICEUPDT.232    
!                                                                          ICEUPDT.233    
! Code Description:                                                        ICEUPDT.234    
!   Language: FORTRAN 77 + common extensions.                              ICEUPDT.235    
!   This code is written to UMDP3 v6 programming standards.                ICEUPDT.236    
!                                                                          ICEUPDT.237    
! System component covered:  P4                                            ICEUPDT.238    
! System Task:                                                             ICEUPDT.239    
!                                                                          ICEUPDT.240    
! Declarations:                                                            ICEUPDT.241    
!   These are of the form:-                                                ICEUPDT.242    
!     INTEGER      ExampleVariable      !Description of variable           ICEUPDT.243    
!                                                                          ICEUPDT.244    
! Global variables (*CALLed COMDECKs etc...):                              ICEUPDT.245    
!   NONE                                                                   ICEUPDT.246    
! Subroutine arguments                                                     ICEUPDT.247    
*CALL TYPOINDX                                                             ORH7F402.260    
!   Scalar arguments with intent(in):                                      ICEUPDT.248    
!                                                                          ORH3F402.230    
      INTEGER imt      ! IN row size                                       ICEUPDT.249    
      INTEGER jmt      ! IN column size                                    ICEUPDT.250    
                                                                           ICEUPDT.251    
!   Array  arguments with intent(in):                                      ICEUPDT.252    
      REAL aice(imt,jmt)      ! IN ice conc.                               ICEUPDT.253    
      REAL dela(imt,jmt)      ! IN ice conc. increment                     ICEUPDT.254    
                                                                           ICEUPDT.255    
!   Scalar arguments with intent(InOut):                                   ICEUPDT.256    
                                                                           ICEUPDT.257    
!   Array  arguments with intent(InOut):                                   ICEUPDT.258    
      REAL hsnow(imt,jmt)    ! INOUT snow depth                            ICEUPDT.259    
                                                                           ICEUPDT.260    
!   Scalar arguments with intent(out):                                     ICEUPDT.261    
                                                                           ICEUPDT.262    
!   Array  arguments with intent(out):                                     ICEUPDT.263    
                                                                           ICEUPDT.264    
! Local parameters:                                                        ICEUPDT.265    
                                                                           ICEUPDT.266    
! Local scalars:                                                           ICEUPDT.267    
      INTEGER i,j      ! loop counters                                     ICEUPDT.268    
                                                                           ICEUPDT.269    
! Local dynamic arrays:                                                    ICEUPDT.270    
                                                                           ICEUPDT.271    
! Function & Subroutine calls:                                             ICEUPDT.272    
                                                                           ICEUPDT.273    
!- End of header                                                           ICEUPDT.274    
!------------------------------------------------------------------        ICEUPDT.275    
!     REDISTRIBUTE SNOW IF ICE AREA HAS INCREASED,USING THE INITIAL        ICEUPDT.276    
!     AND FINAL AREAL FRACTIONS                                            ICEUPDT.277    
                                                                           ICEUPDT.278    
      DO j = J_1,J_jmt                                                     ORH3F402.231    
      DO i=1,imt                                                           ICEUPDT.280    
        IF ( dela(i,j) .GT. 0.0 ) THEN                                     ICEUPDT.281    
          hsnow(i,j) = (hsnow(i,j)*(aice(i,j)-dela(i,j)))/aice(i,j)        ICEUPDT.282    
        ENDIF                                                              ICEUPDT.283    
      ENDDO                                                                ICEUPDT.284    
      ENDDO                                                                ICEUPDT.285    
                                                                           ICEUPDT.286    
      RETURN                                                               ICEUPDT.287    
      END                                                                  ICEUPDT.288    
*ENDIF                                                                     ICEUPDT.289