#include "cppdefs.h"
#ifdef ICE_MODEL
      SUBROUTINE seaice
!
!=======================================================================
!  Copyright (c) 2002-2019 The ROMS/TOMS Group                         !
!================================================== Hernan G. Arango ===
!                                                                      !
!  This is the main driver routine for the sea ice portion of the
!  model.
!                                                                      !
!=======================================================================
!
      USE mod_param
      USE mod_parallel
      USE mod_scalars
      USE mod_stepping
      USE mod_ice
      USE mod_forces

      USE ice_spdiw_mod, ONLY : ice_spdiw
      USE ice_vbc_mod, ONLY : ice_vbc
# ifdef ICE_THERMO
      USE ice_thermo_mod, ONLY : ice_thermo
# endif
# if defined ICE_MOMENTUM && defined ICE_EVP
      USE ice_evp_mod, ONLY : ice_evp
      USE ice_evp_sig_mod, ONLY : ice_evp_sig
      USE ice_elastic_mod, ONLY : ice_elastic
# endif
# ifdef ICE_ADVECT
      USE ice_advect_mod, ONLY : ice_advect
      USE ice_enthalpi_mod, ONLY : ice_enthalpi
# endif
# if defined ICE_ADVECT || defined ICE_THERMO
      USE ice_limit_mod, ONLY : ice_limit
# endif

      implicit none

      integer :: tile
      integer :: ig, ng, nl, my_ievp, nelas
      real(r8), parameter :: dt_large = 1.0E+23_r8

      NEST_LAYER : DO nl=1,NestLayers

        DO ig=1,GridsInLayer(nl)
          ng=GridNumber(ig,nl)
          liold(ng) = linew(ng)
          linew(ng) = 3-liold(ng)

! ----------------------------------------------------------------------
!  Compute the ice-ocean shear.
! ----------------------------------------------------------------------
          DO tile=first_tile(ng),last_tile(ng),+1
            CALL ice_spdiw(ng, TILE)
          END DO
        END DO
!$OMP BARRIER
! ----------------------------------------------------------------------
!  Compute the stresses on the ice from the air and water.
! ----------------------------------------------------------------------
        DO ig=1,GridsInLayer(nl)
          ng=GridNumber(ig,nl)
          DO tile=first_tile(ng),last_tile(ng),+1
            CALL ice_vbc(ng, TILE)
          END DO
!$OMP BARRIER
        END DO

#undef ACTIVE
#ifdef ACTIVE
!ACTIVE
#endif

#ifdef ICE_MOMENTUM
# ifdef ICE_EVP
! ----------------------------------------------------------------------
!  Compute the internal ice stresses according to the 
!  Elastic-Viscous-Plastic rheology (EVP).
! ----------------------------------------------------------------------

        DO ig=1,GridsInLayer(nl)
          ng=GridNumber(ig,nl)
          nelas = nevp(ng)

          liuol(ng) = liunw(ng)
          liunw(ng) = 3-liuol(ng)

          dte(ng) = dtice(ng)/FLOAT(nevp(ng))

          DO my_ievp=1,nelas

            lieol(ng) = lienw(ng)
            lienw(ng) = 3-lieol(ng)

            ievp(ng)=my_ievp
            DO tile=first_tile(ng),last_tile(ng),+1
              CALL ice_evp(ng, TILE)
            END DO
!$OMP BARRIER
            DO tile=first_tile(ng),last_tile(ng),+1
              CALL ice_evp_sig(ng, TILE)
            END DO
!$OMP BARRIER
            DO tile=first_tile(ng),last_tile(ng),+1
              CALL ice_elastic(ng, TILE)
            END DO
!$OMP BARRIER
          END DO
        END DO

# else
        write(*,*) 'An ice rheology must be defined if ICE_MOMENTUM',     &
     &           ' option is specified'
        stop
# endif
#endif

#ifdef ICE_ADVECT
! ----------------------------------------------------------------------
!  Compute the ice enthalpi before advection.
! ----------------------------------------------------------------------
        DO ig=1,GridsInLayer(nl)
          ng=GridNumber(ig,nl)
          DO tile=first_tile(ng),last_tile(ng),+1
            CALL ice_enthalpi(ng, TILE)
          END DO
!$OMP BARRIER
        END DO
! ----------------------------------------------------------------------
!  Compute the advection of the ice tracer fields.
! ----------------------------------------------------------------------
        DO ig=1,GridsInLayer(nl)
          ng=GridNumber(ig,nl)
          DO tile=first_tile(ng),last_tile(ng),+1
            CALL ice_advect(ng, TILE)
            CALL ice_limit(ng, TILE)
          END DO
!$OMP BARRIER
        END DO
#endif

#ifdef ICE_THERMO
! ----------------------------------------------------------------------
!  Compute the ice thermodynamics.
! ----------------------------------------------------------------------
        DO ig=1,GridsInLayer(nl)
          ng=GridNumber(ig,nl)
          DO tile=first_tile(ng),last_tile(ng),+1
            CALL ice_thermo (ng, TILE)
            CALL ice_limit(ng, TILE)
          END DO
!$OMP BARRIER
        END DO
#endif

      END DO NEST_LAYER

#else
      SUBROUTINE seaice
#endif
      RETURN
      END SUBROUTINE seaice