diff --git a/components/mpas-albany-landice/src/Registry.xml b/components/mpas-albany-landice/src/Registry.xml
index b42f68d6f7e9..e522e7412c7b 100644
--- a/components/mpas-albany-landice/src/Registry.xml
+++ b/components/mpas-albany-landice/src/Registry.xml
@@ -492,6 +492,10 @@
description="Order of Runge-Kutta time integration to use. A value of 1 is equivalent to forward euler. Values of 2 and 3 indicate strong-stability preserving RK2 and RK3. There is currently no support for classical RK2 or RK4 methods."
possible_values="1, 2, 3"
/>
+
1 ) then
+ ! For first RK stage, thickness and tracer updates above are sufficient.
+ ! Likewise, for the 4-stage SSP RK3 the last stage is just a forward euler update.
+ if ( (rkStage > 1) .and. (rkStage < 4) ) then
call mpas_pool_get_array(geometryPool, 'thickness', thickness)
call mpas_pool_get_array(geometryPool, 'layerThickness', layerThickness)
call mpas_pool_get_array(geometryPool, 'passiveTracer2d', passiveTracer2d)
@@ -507,7 +526,7 @@ subroutine prepare_advection(domain, err)
real (kind=RKIND), dimension(:,:), pointer :: normalVelocity
real (kind=RKIND), dimension(:,:), pointer :: layerNormalVelocity
real (kind=RKIND), pointer :: calvingCFLdt, faceMeltingCFLdt
- integer, pointer :: processLimitingTimestep
+ integer, pointer :: processLimitingTimestep, config_rk_order, config_rk3_stages
integer, dimension(:), pointer :: edgeMask
logical, pointer :: config_print_thickness_advection_info
@@ -515,7 +534,8 @@ subroutine prepare_advection(domain, err)
logical, pointer :: config_adaptive_timestep_include_DCFL
character (len=StrKIND), pointer :: &
- config_thickness_advection ! method for advecting thickness and tracers
+ config_thickness_advection, & ! method for advecting thickness and tracers
+ config_time_integration
integer :: &
allowableAdvecDtProcNumberHere, &
@@ -567,6 +587,9 @@ subroutine prepare_advection(domain, err)
call mpas_pool_get_config(liConfigs, 'config_adaptive_timestep', config_adaptive_timestep)
call mpas_pool_get_config(liConfigs, 'config_adaptive_timestep_include_DCFL', config_adaptive_timestep_include_DCFL)
call mpas_pool_get_config(liConfigs, 'config_thickness_advection', config_thickness_advection)
+ call mpas_pool_get_config(liConfigs, 'config_time_integration', config_time_integration)
+ call mpas_pool_get_config(liConfigs, 'config_rk_order', config_rk_order)
+ call mpas_pool_get_config(liConfigs, 'config_rk3_stages', config_rk3_stages)
if (trim(config_thickness_advection) == 'none') then
if (config_adaptive_timestep) then
@@ -612,7 +635,6 @@ subroutine prepare_advection(domain, err)
err = ior(err, err_tmp)
allowableAdvecDtOnProc = min(allowableAdvecDtOnProc, allowableAdvecDt)
-
! Calculate diffusive CFL timestep, if needed
! This used to be only calculated if (config_adaptive_timestep_include_DCFL) but for simplicity,
! now it is always calculated. That allows assessment of the DCFL even when it is not being obeyed
@@ -637,6 +659,12 @@ subroutine prepare_advection(domain, err)
block => block % next
end do
+ ! If using 4-stage SSPRK3, CFL number of 2 is theoretically allowed
+ if ( (trim(config_time_integration) == 'runge_kutta') .and. &
+ (config_rk_order == 3) .and. (config_rk3_stages == 4) ) then
+ allowableAdvecDtOnProc = allowableAdvecDtOnProc * 2.0_RKIND
+ allowableDiffDtOnProc = allowableDiffDtOnProc * 2.0_RKIND
+ endif
! Local advective CFL info
call mpas_set_timeInterval(allowableAdvecDtOnProcInterval, dt=allowableAdvecDtOnProc, ierr=err_tmp)