Skip to content

Commit fd4a3d7

Browse files
authored
Merge pull request #1495 from CliMA/cc/sea_ice_fluxes
Modify sea ice surface fluxes and bulk initialization: Zero LHF over sea ice through beta. Pass surface temperature estimate (rather than bulk) to coupler. Initialize bulk temperature below freezing.
2 parents a2bf8c7 + e4a63a6 commit fd4a3d7

File tree

2 files changed

+23
-10
lines changed

2 files changed

+23
-10
lines changed

experiments/ClimaEarth/components/ocean/prescr_seaice.jl

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,9 @@ end
4747

4848
# init simulation
4949
function slab_ice_space_init(::Type{FT}, space, params) where {FT}
50-
Y = CC.Fields.FieldVector(T_sfc = ones(space) .* params.T_freeze)
50+
# bulk temperatures commonly 10-20 K below freezing for sea ice 2m thick in winter,
51+
# and closer to freezing in summer and when melting.
52+
Y = CC.Fields.FieldVector(T_sfc = ones(space) .* params.T_freeze .- FT(5.0))
5153
return Y
5254
end
5355

@@ -170,8 +172,17 @@ Interfacer.get_field(
170172
sim::PrescribedIceSimulation,
171173
::Union{Val{:surface_direct_albedo}, Val{:surface_diffuse_albedo}},
172174
) = sim.integrator.p.params.α
175+
# approximates the surface temperature of the sea ice
176+
# assuming sim.integrator.u.T_sfc represents the vertically-averaged (bulk) temperature
177+
# and the ice temperature varies linearly between the ice surface and the base.
173178
Interfacer.get_field(sim::PrescribedIceSimulation, ::Val{:surface_temperature}) =
174-
sim.integrator.u.T_sfc
179+
2 .* sim.integrator.u.T_sfc .- sim.integrator.p.params.T_base
180+
181+
function Interfacer.get_field(sim::PrescribedIceSimulation, ::Val{:beta})
182+
# assume no LHF over sea ice
183+
FT = eltype(sim.integrator.u)
184+
return FT(0)
185+
end
175186

176187
"""
177188
Interfacer.get_field(sim::PrescribedIceSimulation, ::Val{:energy})

experiments/ClimaEarth/test/component_model_tests/prescr_seaice_tests.jl

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,13 @@ for FT in (Float32, Float64)
6868
return dY, Y, p
6969
end
7070

71-
# check that nothing changes with no fluxes
72-
dY, Y, p = test_sea_ice_rhs()
71+
# check that nothing changes with no fluxes (zero conduction when T_base == initial T_sfc)
72+
T_base_eq = IceSlabParameters{FT}().T_freeze - FT(5.0)
73+
dY, Y, p = test_sea_ice_rhs(T_base = T_base_eq)
7374
@test all([i for i in extrema(dY)] .≈ [FT(0.0), FT(0.0)])
7475

75-
# check that extracting expected T due to input atmopsheric fluxes
76-
dY, Y, p = test_sea_ice_rhs(F_radiative = 1.0)
76+
# check expected dT due to radiative flux only (again set T_base == initial T_sfc)
77+
dY, Y, p = test_sea_ice_rhs(F_radiative = 1.0, T_base = T_base_eq)
7778
dT_expected = -1.0 / (p.params.h * p.params.ρ * p.params.c)
7879
@test all(extrema(dY) .≈ FT(dT_expected))
7980

@@ -82,12 +83,13 @@ for FT in (Float32, Float64)
8283
dT_maximum = @. (p.params.T_freeze - Y.T_sfc) / p.dt
8384
@test minimum(dT_maximum .- dY.T_sfc) >= FT(0.0)
8485

85-
# check that the correct tendency was added due to basal flux
86+
# check that the correct tendency was added due to basal conductive flux
8687
dY, Y, p = test_sea_ice_rhs(F_radiative = 0.0, T_base = 269.2)
8788
dT_expected =
88-
-2.0 * p.params.k_ice / (p.params.h * p.params.h * p.params.ρ * p.params.c)
89-
@test minimum(dY) FT(dT_expected)
90-
@test maximum(dY) FT(0)
89+
(p.params.k_ice / (p.params.h * p.params.h * p.params.ρ * p.params.c)) *
90+
(p.params.T_base - minimum(Y.T_sfc))
91+
@test minimum(dY) FT(0)
92+
@test maximum(dY) FT(dT_expected)
9193
end
9294

9395
@testset "dss_state! SeaIceModelSimulation for FT=$FT" begin

0 commit comments

Comments
 (0)