diff --git a/src/ICE/icedyn_rdgrft.F90 b/src/ICE/icedyn_rdgrft.F90 index 306fc5e5c31cc80c0dc63b6d7068eeea184ad1c1..661748ea3b97e4f5e25f5780c8d29da6149ddc4d 100644 --- a/src/ICE/icedyn_rdgrft.F90 +++ b/src/ICE/icedyn_rdgrft.F90 @@ -51,6 +51,7 @@ MODULE icedyn_rdgrft REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) :: apartf ! participation function; fraction of ridging/closing associated w/ category n REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) :: hrmin ! minimum ridge thickness REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) :: hrmax ! maximum ridge thickness + REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) :: hrexp ! e-folding ridge thickness REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) :: hraft ! thickness of rafted ice REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) :: hi_hrdg ! thickness of ridging ice / mean ridge thickness REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) :: aridge ! participating ice ridging @@ -59,7 +60,7 @@ MODULE icedyn_rdgrft REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: ze_s_2d ! REAL(wp), PARAMETER :: hrdg_hi_min = 1.1_wp ! min ridge thickness multiplier: min(hrdg/hi) - REAL(wp), PARAMETER :: hi_hrft = 0.5_wp ! rafting multipliyer: (hi/hraft) + REAL(wp), PARAMETER :: hi_hrft = 0.5_wp ! rafting multiplier: (hi/hraft) ! ! ** namelist (namdyn_rdgrft) ** LOGICAL :: ln_str_R75 ! ice strength parameterization: Rothrock 75 @@ -68,7 +69,7 @@ MODULE icedyn_rdgrft REAL(wp) :: rn_str ! constant value of ice strength LOGICAL :: ln_str_smooth ! ice strength spatial smoothing LOGICAL :: ln_distf_lin ! redistribution of ridged ice: linear (Hibler 1980) - LOGICAL :: ln_distf_exp ! redistribution of ridged ice: exponential + LOGICAL :: ln_distf_exp ! redistribution of ridged ice: exponential (Lipscomb et al 2017) REAL(wp) :: rn_murdg ! gives e-folding scale of ridged ice (m^.5) REAL(wp) :: rn_csrdg ! fraction of shearing energy contributing to ridging LOGICAL :: ln_partf_lin ! participation function linear (Thorndike et al. (1975)) @@ -99,9 +100,9 @@ CONTAINS !!------------------------------------------------------------------- !! *** ROUTINE ice_dyn_rdgrft_alloc *** !!------------------------------------------------------------------- - ALLOCATE( closing_net(jpij) , opning(jpij) , closing_gross(jpij) , & - & apartf(jpij,0:jpl) , hrmin (jpij,jpl) , hraft(jpij,jpl) , aridge(jpij,jpl), & - & hrmax (jpij,jpl) , hi_hrdg(jpij,jpl) , araft(jpij,jpl) , & + ALLOCATE( closing_net(jpij) , opning(jpij) , closing_gross(jpij), & + & apartf(jpij,0:jpl), hrmin (jpij,jpl), hraft(jpij,jpl) , aridge(jpij,jpl), & + & hrmax (jpij,jpl) , hrexp (jpij,jpl), hi_hrdg(jpij,jpl) , araft(jpij,jpl) , & & ze_i_2d(jpij,nlay_i,jpl), ze_s_2d(jpij,nlay_s,jpl), STAT=ice_dyn_rdgrft_alloc ) CALL mpp_sum ( 'icedyn_rdgrft', ice_dyn_rdgrft_alloc ) @@ -353,7 +354,7 @@ CONTAINS zGsum(1:npti,-1) = 0._wp zGsum(1:npti,0 ) = pato_i(1:npti) * z1_asum(1:npti) DO jl = 1, jpl - zGsum(1:npti,jl) = ( pato_i(1:npti) + SUM( pa_i(1:npti,1:jl), dim=2 ) ) * z1_asum(1:npti) ! sum(1:jl) is ok (and not jpl) + zGsum(1:npti,jl) = ( pato_i(1:npti) + SUM( pa_i(1:npti,1:jl), dim=2 ) ) * z1_asum(1:npti) ! sum(1:jl) is correct (and not jpl) END DO ! IF( ln_partf_lin ) THEN !--- Linear formulation (Thorndike et al., 1975) @@ -420,8 +421,10 @@ CONTAINS ! 2) Transfer function !----------------------------------------------------------------- + ! If assuming ridged ice is uniformly distributed between hrmin and + ! hrmax (ln_distf_lin): + ! ! Compute max and min ridged ice thickness for each ridging category. - ! Assume ridged ice is uniformly distributed between hrmin and hrmax. ! ! This parameterization is a modified version of Hibler (1980). ! The mean ridging thickness, zhmean, is proportional to hi^(0.5) @@ -436,9 +439,37 @@ CONTAINS ! These modifications have the effect of reducing the ice strength ! (relative to the Hibler formulation) when very thick ice is ridging. ! - ! zaksum = net area removed/ total area removed - ! where total area removed = area of ice that ridges - ! net area removed = total area removed - area of new ridges + !----------------------------------------------------------------- + ! If assuming ridged ice ITD is a negative exponential + ! (ln_distf_exp) and following CICE implementation: + ! + ! g(h) ~ exp[-(h-hrmin)/hrexp], h >= hrmin + ! + ! where hrmin is the minimum thickness of ridging ice and + ! hrexp is the e-folding thickness. + ! + ! Here, assume as above that hrmin = min(2*hi, hi+maxraft). + ! That is, the minimum ridge thickness results from rafting, + ! unless the ice is thicker than maxraft. + ! + ! Also, assume that hrexp = mu_rdg*sqrt(hi). + ! The parameter mu_rdg is tuned to give e-folding scales mostly + ! in the range 2-4 m as observed by upward-looking sonar. + ! + ! Values of mu_rdg in the right column give ice strengths + ! roughly equal to values of Hstar in the left column + ! (within ~10 kN/m for typical ITDs): + ! + ! Hstar mu_rdg + ! + ! 25 3.0 + ! 50 4.0 + ! 75 5.0 + ! 100 6.0 + ! + ! zaksum = net area removed/ total area participating + ! where total area participating = area of ice that ridges + ! net area removed = total area participating - area of new ridges !----------------------------------------------------------------- zfac = 1._wp / hi_hrft zaksum(1:npti) = apartf(1:npti,0) @@ -448,9 +479,16 @@ CONTAINS IF ( apartf(ji,jl) > 0._wp ) THEN zhmean = MAX( SQRT( rn_hstar * zhi(ji,jl) ), zhi(ji,jl) * hrdg_hi_min ) hrmin (ji,jl) = MIN( 2._wp * zhi(ji,jl), 0.5_wp * ( zhmean + zhi(ji,jl) ) ) - hrmax (ji,jl) = 2._wp * zhmean - hrmin(ji,jl) hraft (ji,jl) = zhi(ji,jl) * zfac - hi_hrdg(ji,jl) = zhi(ji,jl) / MAX( zhmean, epsi20 ) + ! + IF( ln_distf_lin ) THEN + hrmax (ji,jl) = 2._wp * zhmean - hrmin(ji,jl) + hi_hrdg(ji,jl) = zhi(ji,jl) / MAX( zhmean, epsi20 ) + ELSEIF( ln_distf_exp ) THEN + hrexp (ji,jl) = rn_murdg * SQRT( zhi(ji,jl) ) + hi_hrdg(ji,jl) = zhi(ji,jl) / ( hrmin(ji,jl) + hrexp(ji,jl) ) + !!clem: set a mini for zhi?? + ENDIF ! ! Normalization factor : zaksum, ensures mass conservation zaksum(ji) = zaksum(ji) + aridge(ji,jl) * ( 1._wp - hi_hrdg(ji,jl) ) & @@ -458,8 +496,10 @@ CONTAINS ELSE hrmin (ji,jl) = 0._wp hrmax (ji,jl) = 0._wp + hrexp (ji,jl) = 0._wp hraft (ji,jl) = 0._wp hi_hrdg(ji,jl) = 1._wp + !!clem zaksum(ji,jl) = 0._wp ENDIF END DO END DO @@ -513,6 +553,7 @@ CONTAINS ! INTEGER :: ji, jj, jl, jl1, jl2, jk ! dummy loop indices REAL(wp) :: hL, hR, farea ! left and right limits of integration and new area going to jl2 + REAL(wp) :: expL, expR ! exponentials involving hL, hR REAL(wp) :: vsw ! vol of water trapped into ridges REAL(wp) :: afrdg, afrft ! fraction of category area ridged/rafted REAL(wp) :: airdg1, oirdg1, aprdg1, virdg1, sirdg1 @@ -694,18 +735,50 @@ CONTAINS IF( ll_shift(ji) ) THEN ! Compute the fraction of ridged ice area and volume going to thickness category jl2 - IF( hrmin(ji,jl1) <= hi_max(jl2) .AND. hrmax(ji,jl1) > hi_max(jl2-1) ) THEN - hL = MAX( hrmin(ji,jl1), hi_max(jl2-1) ) - hR = MIN( hrmax(ji,jl1), hi_max(jl2) ) - farea = ( hR - hL ) / ( hrmax(ji,jl1) - hrmin(ji,jl1) ) - fvol(ji) = ( hR * hR - hL * hL ) / ( hrmax(ji,jl1) * hrmax(ji,jl1) - hrmin(ji,jl1) * hrmin(ji,jl1) ) + IF( ln_distf_lin ) THEN ! Hibler (1980) linear formulation ! - itest_rdg(ji) = 1 ! test for conservation - ELSE - farea = 0._wp - fvol(ji) = 0._wp - ENDIF - + IF( hrmin(ji,jl1) <= hi_max(jl2) .AND. hrmax(ji,jl1) > hi_max(jl2-1) ) THEN + hL = MAX( hrmin(ji,jl1), hi_max(jl2-1) ) + hR = MIN( hrmax(ji,jl1), hi_max(jl2) ) + farea = ( hR - hL ) / ( hrmax(ji,jl1) - hrmin(ji,jl1) ) + fvol(ji) = ( hR * hR - hL * hL ) / ( hrmax(ji,jl1) * hrmax(ji,jl1) - hrmin(ji,jl1) * hrmin(ji,jl1) ) + ! + itest_rdg(ji) = 1 ! test for conservation + ELSE + farea = 0._wp + fvol(ji) = 0._wp + ENDIF + ! + ELSEIF( ln_distf_exp ) THEN ! Lipscomb et al. (2007) exponential formulation + ! + IF( jl2 < jpl ) THEN + ! + IF( hrmin(ji,jl1) <= hi_max(jl2) ) THEN + hL = MAX( hrmin(ji,jl1), hi_max(jl2-1) ) + hR = hi_max(jl2) + expL = EXP( -( hL - hrmin(ji,jl1) ) / hrexp(ji,jl1) ) + expR = EXP( -( hR - hrmin(ji,jl1) ) / hrexp(ji,jl1) ) + farea = expL - expR + fvol(ji) = ( ( hL + hrexp(ji,jl1) ) * expL & + - ( hR + hrexp(ji,jl1) ) * expR ) / ( hrmin(ji,jl1) + hrexp(ji,jl1) ) + ELSE + farea = 0._wp + fvol(ji) = 0._wp + END IF + ! + ELSE ! jl2 = jpl + ! + hL = MAX( hrmin(ji,jl1), hi_max(jl2-1) ) + expL = EXP(-( hL - hrmin(ji,jl1) ) / hrexp(ji,jl1) ) + farea = expL + fvol(ji) = ( hL + hrexp(ji,jl1) ) * expL / ( hrmin(ji,jl1) + hrexp(ji,jl1) ) + ! + END IF ! jl2 < jpl + ! + itest_rdg(ji) = 1 ! test for conservation => clem: I am not sure about that + ! + END IF ! ridge redistribution + ! Compute the fraction of rafted ice area and volume going to thickness category jl2 IF( hraft(ji,jl1) <= hi_max(jl2) .AND. hraft(ji,jl1) > hi_max(jl2-1) ) THEN zswitch(ji) = 1._wp @@ -780,18 +853,20 @@ CONTAINS !! !! ** Purpose : computes ice strength used in dynamics routines of ice thickness !! - !! ** Method : Compute the strength of the ice pack, defined as the energy (J m-2) + !! ** Method : Compute the strength of the ice pack, defined as the energy (J m-2) !! dissipated per unit area removed from the ice pack under compression, !! and assumed proportional to the change in potential energy caused - !! by ridging. Note that only Hibler's formulation is stable and that - !! ice strength has to be smoothed + !! by ridging. Note that ice strength using Hibler's formulation must be + !! smoothed. !!---------------------------------------------------------------------- INTEGER :: ji, jj, jl ! dummy loop indices REAL(wp) :: z1_3 ! local scalars REAL(wp), DIMENSION(jpi,jpj) :: zmsk, zworka ! temporary array used here - !!clem - LOGICAL :: ln_str_R75 - REAL(wp) :: zhi, zcp, rn_pe_rdg + !! + LOGICAL :: ln_str_R75 + REAL(wp) :: zhi, zcp + REAL(wp) :: h2rdg ! mean value of h^2 for new ridge + REAL(wp), PARAMETER :: zmax_strength = 200.e3_wp ! Richter-Menge and Elder (1998) estimate maximum in Beaufort Sea in wintertime of the order 150 kN/m REAL(wp), DIMENSION(jpij) :: zstrength, zaksum ! strength in 1D !!---------------------------------------------------------------------- ! prepare the mask @@ -804,7 +879,7 @@ CONTAINS CASE ( np_strr75 ) !== Rothrock(1975)'s method ==! - ! these 2 param should be defined once for all at the 1st time step + ! this should be defined once for all at the 1st time step zcp = 0.5_wp * grav * (rho0-rhoi) * rhoi * r1_rho0 ! proport const for PE ! strength(:,:) = 0._wp @@ -841,16 +916,31 @@ CONTAINS DO ji = 1, npti ! IF( apartf(ji,jl) > 0._wp ) THEN + ! + IF( ln_distf_lin ) THEN ! Uniform redistribution of ridged ice + h2rdg = z1_3 * ( hrmax(ji,jl) * hrmax(ji,jl) + & ! (a**3-b**3)/(a-b) = a*a+ab+b*b + & hrmin(ji,jl) * hrmin(ji,jl) + & + & hrmax(ji,jl) * hrmin(ji,jl) ) + ! + ELSEIF( ln_distf_exp ) THEN ! Exponential redistribution of ridged ice + h2rdg = hrmin(ji,jl) * hrmin(ji,jl) & + & + 2._wp * hrmin(ji,jl) * hrexp(ji,jl) & + & + 2._wp * hrexp(ji,jl) * hrexp(ji,jl) + END IF ! IF( a_i_2d(ji,jl) > epsi10 ) THEN ; zhi = v_i_2d(ji,jl) / a_i_2d(ji,jl) ELSE ; zhi = 0._wp ENDIF - zstrength(ji) = zstrength(ji) - apartf(ji,jl) * zhi * zhi ! PE loss from deforming ice - zstrength(ji) = zstrength(ji) + 2._wp * araft (ji,jl) * zhi * zhi ! PE gain from rafting ice - zstrength(ji) = zstrength(ji) + aridge(ji,jl) * hi_hrdg(ji,jl) * z1_3 * & ! PE gain from ridging ice - & ( hrmax(ji,jl) * hrmax(ji,jl) + & ! (a**3-b**3)/(a-b) = a*a+ab+b*b - & hrmin(ji,jl) * hrmin(ji,jl) + & - & hrmax(ji,jl) * hrmin(ji,jl) ) +!!$ zstrength(ji) = zstrength(ji) - apartf(ji,jl) * zhi * zhi ! PE loss from deforming ice +!!$ zstrength(ji) = zstrength(ji) + 2._wp * araft (ji,jl) * zhi * zhi ! PE gain from rafting ice +!!$ zstrength(ji) = zstrength(ji) + aridge(ji,jl) * hi_hrdg(ji,jl) * z1_3 * & ! PE gain from ridging ice +!!$ & ( hrmax(ji,jl) * hrmax(ji,jl) + & ! (a**3-b**3)/(a-b) = a*a+ab+b*b +!!$ & hrmin(ji,jl) * hrmin(ji,jl) + & +!!$ & hrmax(ji,jl) * hrmin(ji,jl) ) + zstrength(ji) = zstrength(ji) - apartf(ji,jl) * zhi * zhi ! PE loss + zstrength(ji) = zstrength(ji) + 2._wp * araft(ji,jl) * zhi * zhi ! PE gain (rafting) + zstrength(ji) = zstrength(ji) + aridge(ji,jl) * h2rdg * hi_hrdg(ji,jl) ! PE gain (ridging) + ENDIF ! END DO @@ -858,6 +948,11 @@ CONTAINS ! zstrength(1:npti) = rn_pe_rdg * zcp * zstrength(1:npti) / zaksum(1:npti) ! + ! Enforce a maximum for strength + ! Richter-Menge and Elder (1998) estimate maximum in Beaufort Sea in wintertime of the order 150 kN/m + WHERE( zstrength(1:npti) > zmax_strength ) ; zstrength(1:npti) = zmax_strength + ENDWHERE + ! CALL tab_1d_2d( npti, nptidx(1:npti), zstrength(1:npti), strength ) ! ENDIF @@ -1009,7 +1104,7 @@ CONTAINS WRITE(numout,*) ' ice strength value rn_str = ', rn_str WRITE(numout,*) ' spatial smoothing of the strength ln_str_smooth= ', ln_str_smooth WRITE(numout,*) ' redistribution of ridged ice: linear (Hibler 1980) ln_distf_lin = ', ln_distf_lin - WRITE(numout,*) ' redistribution of ridged ice: exponential ln_distf_exp = ', ln_distf_exp + WRITE(numout,*) ' redistribution of ridged ice: exponential(Lipscomb 2017) ln_distf_exp = ', ln_distf_exp WRITE(numout,*) ' e-folding scale of ridged ice rn_murdg = ', rn_murdg WRITE(numout,*) ' Fraction of shear energy contributing to ridging rn_csrdg = ', rn_csrdg WRITE(numout,*) ' linear ridging participation function ln_partf_lin = ', ln_partf_lin @@ -1034,11 +1129,13 @@ CONTAINS IF( ln_str_CST ) THEN ; ioptio = ioptio + 1 ; nice_str = np_strcst ; ENDIF IF( ioptio /= 1 ) CALL ctl_stop( 'ice_dyn_rdgrft_init: one and only one ice strength option has to be defined ' ) ! + IF ( ( ln_str_H79 .AND. ln_str_R75 ) .OR. ( .NOT.ln_str_H79 .AND. .NOT.ln_str_R75 ) ) THEN + CALL ctl_stop( 'ice_dyn_rdgrft_init: choose one and only one ice strength formulation (ln_str_H79 or ln_str_R75)' ) + ENDIF + ! IF ( ( ln_distf_lin .AND. ln_distf_exp ) .OR. ( .NOT.ln_distf_lin .AND. .NOT.ln_distf_exp ) ) THEN CALL ctl_stop( 'ice_dyn_rdgrft_init: choose one and only one redistribution function (ln_distf_lin or ln_distf_exp)' ) ENDIF - !!clem - IF( ln_distf_exp ) CALL ctl_stop( 'ice_dyn_rdgrft_init: exponential redistribution function not coded yet (ln_distf_exp)' ) ! IF ( ( ln_partf_lin .AND. ln_partf_exp ) .OR. ( .NOT.ln_partf_lin .AND. .NOT.ln_partf_exp ) ) THEN CALL ctl_stop( 'ice_dyn_rdgrft_init: choose one and only one participation function (ln_partf_lin or ln_partf_exp)' )