Skip to content

Commit 7484cc7

Browse files
committed
Merge branch 'master-v7.0/initialization_seaice_threshold' into develop (PR #972)
This merge adjusts the initialization of xice for cold sea-surface temperatures Setting xice to 1.0 for sea-surface temperatures colder than 271 K has proved to produce too much sea ice at high latitudes. Furthermore, many datasets provide a sea ice fraction field. Determination of using actual sea ice fraction input or setting xice to 1.0 for sea-surface temperatures colder than a pre-defined value in the case where fractional sea ice is not provided in the input is now moved to the subroutine physics_init_seaice in module mpas_atmphys_initialize_real.F. Now, the temperature threshold for converting water points to sea ice with a fraction of 1.0 is set by a new namelist option, config_tsk_seaice_threshold, in a new &physics namelist group. The default value for this threshold is 100 K, which effectively shuts off the conversion of water to sea ice, which is reasonable when ingesting datasets that already provide a fractional sea ice field.
2 parents 578f2af + 49b1905 commit 7484cc7

3 files changed

Lines changed: 15 additions & 7 deletions

File tree

src/core_atmosphere/physics/mpas_atmphys_initialize_real.F

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,10 @@ module mpas_atmphys_initialize_real
5555
! * In subroutine physics_init_seaice, added the initialization of the annual maximum snow albedo over seaice
5656
! points to 0.75.
5757
! * Laura D. Fowler (laura@ucar.edu) / 2022-03-15).
58+
! * In subroutine physics_init_seaice, corrected the initialization of seaice points when the surface
59+
! temperature was originally colder than 271K. We now use the seaice threshold config_tsk_seaice_threshold
60+
! that has a default value set to 100K. This leads to decreased seaice at high latitudes.
61+
! Laura D. Fowler (laura@ucar.edu) / 2022-03-25.
5862

5963

6064
contains
@@ -599,6 +603,7 @@ subroutine physics_init_seaice(mesh, input, dims, configs)
599603

600604
real(kind=RKIND):: xice_threshold
601605
real(kind=RKIND):: mid_point_depth
606+
real(kind=RKIND),pointer:: tsk_seaice_threshold
602607
real(kind=RKIND),dimension(:),pointer :: vegfra
603608
real(kind=RKIND),dimension(:),pointer :: seaice,snoalb,xice
604609
real(kind=RKIND),dimension(:),pointer :: skintemp,tmn,xland
@@ -611,15 +616,15 @@ subroutine physics_init_seaice(mesh, input, dims, configs)
611616
!note that this threshold is also defined in module_physics_vars.F.It is defined here to avoid
612617
!adding "use module_physics_vars" since this subroutine is only used for the initialization of
613618
!a "real" forecast with $CORE = init_nhyd_atmos.
614-
real(kind=RKIND),parameter:: xice_tsk_threshold = 271.
615619
real(kind=RKIND),parameter:: total_depth = 3. ! 3-meter soil depth.
616620

617621
!-----------------------------------------------------------------------------------------------------------------
618622
!call mpas_log_write('')
619623
!call mpas_log_write('--- enter physics_init_seaice:')
620624

621-
call mpas_pool_get_config(configs, 'config_frac_seaice', config_frac_seaice)
622-
call mpas_pool_get_config(configs, 'config_landuse_data', config_landuse_data)
625+
call mpas_pool_get_config(configs, 'config_frac_seaice' , config_frac_seaice)
626+
call mpas_pool_get_config(configs, 'config_tsk_seaice_threshold', tsk_seaice_threshold)
627+
call mpas_pool_get_config(configs, 'config_landuse_data' , config_landuse_data)
623628

624629
call mpas_pool_get_dimension(dims, 'nCellsSolve', nCellsSolve)
625630
call mpas_pool_get_dimension(dims, 'nSoilLevels', nSoilLevels)
@@ -660,13 +665,14 @@ subroutine physics_init_seaice(mesh, input, dims, configs)
660665
endif
661666
call mpas_log_write('--- config_frac_seaice : $l', logicArgs=(/config_frac_seaice/))
662667
call mpas_log_write('--- xice_threshold : $r', realArgs=(/xice_threshold/))
668+
call mpas_log_write('--- tsk_seaice_threshold : $r', realArgs=(/tsk_seaice_threshold/))
663669

664670
!convert seaice points to land points when the sea-ice fraction is greater than the
665671
!prescribed threshold:
666672
num_seaice_changes = 0
667673
do iCell = 1, nCellsSolve
668674
if(xice(iCell) .ge. xice_threshold .or. &
669-
(landmask(iCell).eq.0 .and. skintemp(iCell).lt.xice_tsk_threshold)) then
675+
(landmask(iCell).eq.0 .and. skintemp(iCell).lt.tsk_seaice_threshold)) then
670676

671677
num_seaice_changes = num_seaice_changes + 1
672678
!... sea-ice points are converted to land points:

src/core_init_atmosphere/Registry.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,12 @@
278278
units="-"
279279
description="Whether to switch sea-ice threshold from 0.5 to 0.02"
280280
possible_values="true or false"/>
281+
</nml_record>
281282

283+
<nml_record name="physics" in_defaults="false">
284+
<nml_option name="config_tsk_seaice_threshold" type="real" default_value="100." units="K"
285+
description="surface temperature threshold below which water points are set to seaice points"
286+
possible_values="Positive real values"/>
282287
</nml_record>
283288

284289
<nml_record name="io" in_defaults="true">

src/core_init_atmosphere/mpas_init_atm_cases.F

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4559,9 +4559,6 @@ subroutine init_atm_case_gfs(block, mesh, nCells, nEdges, nVertLevels, fg, state
45594559

45604560
if (allocated(maskslab)) deallocate(maskslab)
45614561

4562-
! Freeze really cold ocean
4563-
where (sst < 271.0 .and. landmask == 0) xice = 1.0
4564-
45654562
! Limit XICE to values between 0 and 1. Although the input meteorological field is between 0.
45664563
! and 1., interpolation to the MPAS grid can yield values of XiCE less than 0. and greater
45674564
! than 1.:

0 commit comments

Comments
 (0)