In my experiments (Caspian sea with ice model) there was a following situation: ice thickness was more then depth in the same points. (7 meters ice thickness in points with 2 meters depth). In north part of Caspian sea large area has depth ~ 2 meters and in winter this part becomes covered by an sea-ice. In addition large values of thickness give more later disappearance of the ice in the spring (one month). That is for Caspian sea this problem is serious. Of course full decision of this problem (anchor ice) is rather difficult. May be it should include analog of wet_dry mask for ice to indicate points with sea-ice thickness equal depth with some ice/snow/water density coefficients, disable bottom freezing, ice moving and include some other changes for ice stresses. More over it will be needed to change the thickness of water layer under ice and parameterize the pressure in water under ice for various sea-ice concentrations. Wet_dry mask of water/land distribution should be changed in the points where sea-ice thickness equal depth also. These complexities frighten And influence of ice on sea bed (scouring) also ...
Now I've made some simple code corrections, but not sure if I am right
In file seaice. F I uncomment line CALL ice_limit(ng, TILE)In ice_limit.F
CALL ice_limit_tile (ng, tile, &
& LBi, UBi, LBj, UBj, &
& IminS, ImaxS, JminS, JmaxS, &
& liold(ng), linew(ng), &
# if defined ICE_BIO && defined BERING_10K
& ICE(ng) % IcePhL, &
& ICE(ng) % IceNO3, &
& ICE(ng) % IceNH4, &
& ICE(ng) % IceLog, &
# endif
& ICE(ng) % ui, &
& ICE(ng) % vi, &
& ICE(ng) % ai, &
& ICE(ng) % hi, &
& ICE(ng) % hsn, &
& ICE(ng) % ti, &
& ICE(ng) % enthalpi, &
& ICE(ng) % sfwat, & !S!!!!!!!!!!!!!!!! changed (,)
& GRID(ng) % h & !S!!!!!!!!!!!!!!!! appended .............................................................................................
!
! Imported variable declarations.
!
integer, intent(in) :: ng, tile
integer, intent(in) :: LBi, UBi, LBj, UBj
integer, intent(in) :: IminS, ImaxS, JminS, JmaxS
integer, intent(inout) :: liold, linew
real(r8), intent(in) :: h(LBi:,LBj:) !S!!!!!!!!!!!!!!!! appended
# ifdef ASSUMED_SHAPE
# if defined ICE_BIO && defined BERING_10K
real(r8), intent(inout) :: IcePhL(LBi:,LBj:,:)
real(r8), intent(inout) :: IceNO3(LBi:,LBj:,:)
real(r8), intent(inout) :: IceNH4(LBi:,LBj:,:)
integer, intent(inout) :: IceLog(LBi:,LBj:,:)
# endif
!S!!!!!!!!!!!!!!!!!!!!!!!!!
! real(r8), intent(in) :: ui(LBi:,LBj:,:) !S!!!!!!!!!! old
! real(r8), intent(in) :: vi(LBi:,LBj:,:) !S!!!!!!!!!! old
real(r8), intent(inout) :: ui(LBi:,LBj:,:) !S!!!!!!!!!! new
real(r8), intent(inout) :: vi(LBi:,LBj:,:) !S!!!!!!!!!! new
!S!!!!!!!!!!!!!!!!!!!!!!!!!
real(r8), intent(inout) :: ai(LBi:,LBj:,:)
real(r8), intent(inout) :: hi(LBi:,LBj:,:)
real(r8), intent(inout) :: hsn(LBi:,LBj:,:)
real(r8), intent(inout) :: ti(LBi:,LBj:,:)
real(r8), intent(inout) :: enthalpi(LBi:,LBj:,:)
real(r8), intent(inout) :: sfwat(LBi:,LBj:,:)
# else
# if defined ICE_BIO && defined BERING_10K
real(r8), intent(inout) :: IcePhL(LBi:UBi,LBj:UBj,2)
real(r8), intent(inout) :: IceNO3(LBi:UBi,LBj:UBj,2)
real(r8), intent(inout) :: IceNH4(LBi:UBi,LBj:UBj,2)
integer, intent(inout) :: IceLog(LBi:UBi,LBj:UBj,2)
# endif
!S!!!!!!!!!!!!!!!!!!!!!!!!!
! real(r8), intent(in) :: ui(LBi:UBi,LBj:UBj,2) !S!!!!!!!!!! old
! real(r8), intent(in) :: vi(LBi:UBi,LBj:UBj,2) !S!!!!!!!!!! old
real(r8), intent(inout) :: ui(LBi:UBi,LBj:UBj,2) !S!!!!!!!!!! new
real(r8), intent(inout) :: vi(LBi:UBi,LBj:UBj,2) !S!!!!!!!!!! new
!S!!!!!!!!!!!!!!!!!!!!!!!!!
......................................................................................
#include "set_bounds.h"
!
DO j=Jstr,Jend
DO i=Istr,Iend
ai(i,j,linew) = MIN(ai(i,j,linew),max_a(ng))
ai(i,j,linew) = MAX(ai(i,j,linew),0.0_r8)
hi(i,j,linew) = MAX(hi(i,j,linew),0.0_r8)
hsn(i,j,linew) = MAX(hsn(i,j,linew),0.0_r8)
!S!!!!!!!!!!!!!!!!!!!!!!!!!
hi(i,j,linew) = MIN((400*hsn(i,j,linew)+930*hi(i,j,linew))/1000,ABS(h(i,j))) !S! appended
IF ((400*hsn(i,j,linew)+930*hi(i,j,linew))/1000 .ge. ABS(h(i,j))) THEN !S!!!!!!! appended
ui(i,j,linew) = 0.0_r8 !S!!!!!!!!!!!!!!!! appended
vi(i,j,linew) = 0.0_r8 !S!!!!!!!!!!!!!!!! appended
END IF !S!!!!!!!!!!!!!!!! appended
!S!!!!!!!!!!!!!!!!!!!!!!!!!
sfwat(i,j,linew) = MAX(sfwat(i,j,linew),0.0_r8)
ti(i,j,linew) = MAX(ti(i,j,linew),-70.0_r8)
IF (hi(i,j,linew) .le. min_h(ng)) ai(i,j,linew) = min_a(ng)
IF (ai(i,j,linew) .le. min_a(ng)) THEN
ai(i,j,linew) = min_a(ng)
hi(i,j,linew) = min_h(ng)
sfwat(i,j,linew) = 0.0_r8
hsn(i,j,linew) = 0.0_r8
END IF
END DO
END DO
My corrections are not coordinated with rules of a writing of ROMS code and can disturb some ice physics (mass balance, for example), but I wished to check up idea.#ifdef ICE_THERMO
! ----------------------------------------------------------------------
! Compute the ice thermodynamics.
! ----------------------------------------------------------------------
DO ng=1,Ngrids
DO tile=first_tile(ng),last_tile(ng),+1
CALL ice_thermo (ng, TILE)
# ifdef ICE_SMOOTH
CALL ice_smoother(ng, TILE)
# endif
CALL ice_limit(ng, TILE)
END DO
!$OMP BARRIER
END DO
#endif
Some fast results are attached
Do not judge strictly