C $Header: /home/ubuntu/mnt/e9_copy/MITgcm_contrib/dgoldberg/streamice/streamice_adv_front.F,v 1.1 2012/03/29 15:59:21 heimbach Exp $ C $Name: $ #include "STREAMICE_OPTIONS.h" C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| CBOP SUBROUTINE STREAMICE_ADV_FRONT ( myThid, time_step ) C /============================================================\ C | SUBROUTINE | C | o | C |============================================================| C | | C \============================================================/ IMPLICIT NONE C === Global variables === #include "SIZE.h" #include "GRID.h" #include "EEPARAMS.h" #include "PARAMS.h" #include "STREAMICE.h" #include "STREAMICE_ADV.h" INTEGER myThid _RL time_step #ifdef ALLOW_STREAMICE INTEGER i, j, bi, bj, k, n_flux, iter_count, iter_flag INTEGER Gi, Gj INTEGER new_partial(4) _RL href, rho, partial_vol, tot_flux, hpot rho = streamice_density iter_count = 0 iter_flag = 1 DO WHILE (iter_flag .eq. 1) iter_flag = 0 IF (iter_count .gt. 0) then DO bj=myByLo(myThid),myByHi(myThid) DO bi=myBxLo(myThid),myBxHi(myThid) DO j=1-OLy,sNy+OLy DO i=1-OLx,sNx+OLx hflux_x_SI(i,j,bi,bj)=hflux_x_SI2(i,j,bi,bj) hflux_y_SI(i,j,bi,bj)=hflux_y_SI2(i,j,bi,bj) hflux_x_SI2(i,j,bi,bj) = 0. _d 0 hflux_y_SI2(i,j,bi,bj) = 0. _d 0 ENDDO ENDDO ENDDO ENDDO ENDIF iter_count = iter_count + 1 DO bj=myByLo(myThid),myByHi(myThid) DO bi=myBxLo(myThid),myBxHi(myThid) DO j=1-1,sNy+1 Gj = (myYGlobalLo-1)+(bj-1)*sNy+j IF ((Gj .ge. 1) .and. (Gj .le. Ny)) THEN DO i=1-1,sNx+1 Gi = (myXGlobalLo-1)+(bi-1)*sNx+i IF ((Gi .ge. 1) .and. (Gi .le. Nx) .and. & (STREAMICE_Hmask(i,j,bi,bj).eq.0.0 .or. & STREAMICE_Hmask(i,j,bi,bj).eq.2.0)) THEN n_flux = 0 href = 0. _d 0 tot_flux = 0. _d 0 IF (hflux_x_SI(i,j,bi,bj).gt. 0. _d 0) THEN n_flux = n_flux + 1 href = href + H_streamice(i-1,j,bi,bj) tot_flux = tot_flux + hflux_x_SI(i,j,bi,bj) * & dxG(i,j,bi,bj) * time_step hflux_x_SI(i,j,bi,bj) = 0. _d 0 ENDIF IF (hflux_x_SI(i+1,j,bi,bj).lt. 0. _d 0) THEN n_flux = n_flux + 1 href = href + H_streamice(i+1,j,bi,bj) tot_flux = tot_flux - hflux_x_SI(i+1,j,bi,bj) * & dxG(i+1,j,bi,bj) * time_step hflux_x_SI(i+1,j,bi,bj) = 0. _d 0 ENDIF IF (hflux_y_SI(i,j,bi,bj).gt. 0. _d 0) THEN n_flux = n_flux + 1 href = href + H_streamice(i,j-1,bi,bj) tot_flux = tot_flux + hflux_y_SI(i,j,bi,bj) * & dyG(i,j,bi,bj) * time_step hflux_y_SI(i,j,bi,bj) = 0. _d 0 ENDIF IF (hflux_y_SI(i,j+1,bi,bj).lt. 0. _d 0) THEN n_flux = n_flux + 1 href = href + H_streamice(i,j+1,bi,bj) tot_flux = tot_flux - hflux_y_SI(i,j+1,bi,bj) * & dyG(i,j+1,bi,bj) * time_step hflux_y_SI(i,j+1,bi,bj) = 0. _d 0 ENDIF IF (n_flux .gt. 0) THEN href = href / real(n_flux) partial_vol = H_streamice (i,j,bi,bj) * & area_shelf_streamice (i,j,bi,bj) + tot_flux hpot = partial_vol * recip_rA(i,j,bi,bj) IF (hpot .eq. href) THEN ! cell is exactly covered, no overflow STREAMICE_hmask (i,j,bi,bj) = 1.0 H_streamice (i,j,bi,bj) = href area_shelf_streamice(i,j,bi,bj) = & rA(i,j,bi,bj) ELSEIF (hpot .lt. href) THEN ! cell still unfilled ! PRINT *, "PARTIAL CELL INCREASED", tot_flux, i, ! & area_shelf_streamice (i,j,bi,bj), ! & H_streamice (i,j,bi,bj) STREAMICE_hmask (i,j,bi,bj) = 2.0 area_shelf_streamice (i,j,bi,bj) = partial_vol / href H_streamice (i,j,bi,bj) = href ELSE ! cell is filled - do overflow ! PRINT *, "CELL FILLED" STREAMICE_hmask (i,j,bi,bj) = 1.0 area_shelf_streamice(i,j,bi,bj) = & rA(i,j,bi,bj) partial_vol = partial_vol - href * rA(i,j,bi,bj) iter_flag = 1 n_flux = 0 ; DO k=1,4 new_partial (:) = 0 ENDDO DO k=1,2 IF (STREAMICE_ufacemask(i-1+k,j,bi,bj).eq.2.0) THEN ! at a permanent calving boundary - no advance allowed n_flux = n_flux + 1 ELSEIF (STREAMICE_hmask(i+2*k-3,j,bi,bj).eq.0 _d 0) THEN ! adjacent cell is completely ice free n_flux = n_flux + 1 new_partial (k) = 1 ENDIF ENDDO DO k=1,2 IF (STREAMICE_vfacemask (i,j-1+k,bi,bj).eq.2.0) THEN n_flux = n_flux + 1 ELSEIF (STREAMICE_hmask(i,j+2*k-3,bi,bj).eq.0 _d 0) THEN n_flux = n_flux + 1 new_partial (k+2) = 1 ENDIF ENDDO IF (n_flux .eq. 0) THEN ! there is nowhere to put the extra ice! H_streamice(i,j,bi,bj) = href + partial_vol * & recip_rA(i,j,bi,bj) ELSE H_streamice(i,j,bi,bj) = href DO k=1,2 IF (new_partial(k) .eq. 1) THEN hflux_x_SI2(i-1+k,j,bi,bj) = & partial_vol/time_step/real(n_flux)/ & dxG(i-1+k,j,bi,bj) ENDIF ENDDO DO k=1,2 IF (new_partial(k+2) .eq. 1) THEN hflux_y_SI2(i,j-1+k,bi,bj) = & partial_vol/time_step/real(n_flux)/ & dxG(i,j-1+k,bi,bj) ENDIF ENDDO ENDIF ENDIF ENDIF ENDIF ENDDO ENDIF ENDDO ENDDO ENDDO ENDDO IF (iter_count.gt.1) THEN PRINT *, "FRONT ADVANCE: ", iter_count, " ITERATIONS" ENDIF #endif RETURN END