Skip to content

Commit 42bc765

Browse files
Better defaults for sea_ice_simulation (#535)
* go for it * Update src/SeaIceSimulations.jl * Update SeaIceSimulations.jl * ice strenght * some.. salinity * Update SeaIceSimulations.jl * Update SeaIceSimulations.jl * some changes * ugly workaround * fix drag * import * correction * bugfix * another one, probably we should export them? * update with free drift * update ClimaSeaIce
1 parent 1e17afc commit 42bc765

File tree

6 files changed

+59
-25
lines changed

6 files changed

+59
-25
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ ClimaOceanReactantExt = "Reactant"
4444
Adapt = "4"
4545
CFTime = "0.1, 0.2"
4646
CUDA = "4, 5"
47-
ClimaSeaIce = "0.2.6"
47+
ClimaSeaIce = "0.3"
4848
CondaPkg = "0.2.28"
4949
CubicSplines = "0.2"
5050
DataDeps = "0.7"

experiments/arctic_simulation.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ set!(ocean.model, T=Metadatum(:temperature; dataset),
5959
##### A Prognostic Sea-ice model
6060
#####
6161

62-
using ClimaSeaIce.SeaIceMomentumEquations
62+
using ClimaSeaIce.SeaIceDynamics
6363
using ClimaSeaIce.Rheologies
6464

6565
# Remember to pass the SSS as a bottom bc to the sea ice!

src/OceanSeaIceModels/InterfaceComputations/sea_ice_ocean_fluxes.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
using Oceananigans.Operators: Δzᶜᶜᶜ
22
using ClimaSeaIce.SeaIceThermodynamics: melting_temperature
3-
using ClimaSeaIce.SeaIceMomentumEquations: x_momentum_stress, y_momentum_stress
3+
using ClimaSeaIce.SeaIceDynamics: x_momentum_stress, y_momentum_stress
44

55
function compute_sea_ice_ocean_fluxes!(coupled_model)
66
ocean = coupled_model.ocean

src/SeaIceSimulations.jl

Lines changed: 53 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,21 @@ using Oceananigans.Operators
1717
using ClimaSeaIce
1818
using ClimaSeaIce: SeaIceModel, SlabSeaIceThermodynamics, PhaseTransitions, ConductiveFlux
1919
using ClimaSeaIce.SeaIceThermodynamics: IceWaterThermalEquilibrium
20+
using ClimaSeaIce.SeaIceDynamics: SplitExplicitSolver, SemiImplicitStress, SeaIceMomentumEquation, StressBalanceFreeDrift
21+
using ClimaSeaIce.Rheologies: IceStrength, ElastoViscoPlasticRheology
2022

2123
using ClimaOcean.OceanSimulations: Default
2224

23-
function sea_ice_simulation(grid;
25+
function sea_ice_simulation(grid, ocean=nothing;
2426
Δt = 5minutes,
25-
ice_salinity = 0, # psu
27+
ice_salinity = 4, # psu
2628
advection = nothing, # for the moment
2729
tracers = (),
2830
ice_heat_capacity = 2100, # J kg⁻¹ K⁻¹
2931
ice_consolidation_thickness = 0.05, # m
3032
ice_density = 900, # kg m⁻³
31-
dynamics = nothing,
32-
bottom_heat_boundary_condition = IceWaterThermalEquilibrium(),
33+
dynamics = sea_ice_dynamics(grid, ocean),
34+
bottom_heat_boundary_condition = nothing,
3335
phase_transitions = PhaseTransitions(; ice_heat_capacity, ice_density),
3436
conductivity = 2, # kg m s⁻³ K⁻¹
3537
internal_heat_flux = ConductiveFlux(; conductivity))
@@ -41,6 +43,16 @@ function sea_ice_simulation(grid;
4143
top_surface_temperature = Field{Center, Center, Nothing}(grid)
4244
top_heat_boundary_condition = PrescribedTemperature(top_surface_temperature)
4345

46+
if isnothing(bottom_heat_boundary_condition)
47+
if isnothing(ocean)
48+
surface_ocean_salinity = 0
49+
else
50+
kᴺ = size(grid, 3)
51+
surface_ocean_salinity = interior(ocean.model.tracers.S, :, :, kᴺ:kᴺ)
52+
end
53+
bottom_heat_boundary_condition = IceWaterThermalEquilibrium(surface_ocean_salinity)
54+
end
55+
4456
ice_thermodynamics = SlabSeaIceThermodynamics(grid;
4557
internal_heat_flux,
4658
phase_transitions,
@@ -50,16 +62,12 @@ function sea_ice_simulation(grid;
5062
bottom_heat_flux = Field{Center, Center, Nothing}(grid)
5163
top_heat_flux = Field{Center, Center, Nothing}(grid)
5264

53-
# top_momentum_stress = (u = Field{Face, Center, Nothing}(grid),
54-
# v = Field{Center, Face, Nothing}(grid))
55-
5665
# Build the sea ice model
5766
sea_ice_model = SeaIceModel(grid;
5867
ice_salinity,
5968
advection,
6069
tracers,
6170
ice_consolidation_thickness,
62-
# top_momentum_stress,
6371
ice_thermodynamics,
6472
dynamics,
6573
bottom_heat_flux,
@@ -73,4 +81,40 @@ function sea_ice_simulation(grid;
7381
return sea_ice
7482
end
7583

76-
end
84+
function sea_ice_dynamics(grid, ocean=nothing;
85+
sea_ice_ocean_drag_coefficient = 5.5e-3,
86+
rheology = ElastoViscoPlasticRheology(pressure_formulation = IceStrength()),
87+
coriolis = nothing,
88+
free_drift = nothing,
89+
solver = SplitExplicitSolver(120))
90+
91+
if isnothing(ocean)
92+
SSU = Oceananigans.Fields.ZeroField()
93+
SSV = Oceananigans.Fields.ZeroField()
94+
else
95+
SSU = view(ocean.model.velocities.u, :, :, grid.Nz)
96+
SSV = view(ocean.model.velocities.v, :, :, grid.Nz)
97+
if isnothing(coriolis)
98+
coriolis = ocean.model.coriolis
99+
end
100+
end
101+
102+
sea_ice_ocean_drag_coefficient = convert(eltype(grid), sea_ice_ocean_drag_coefficient)
103+
104+
τo = SemiImplicitStress(uₑ=SSU, vₑ=SSV, Cᴰ=sea_ice_ocean_drag_coefficient)
105+
τua = Field{Face, Center, Nothing}(grid)
106+
τva = Field{Center, Face, Nothing}(grid)
107+
108+
if isnothing(free_drift)
109+
free_drift = StressBalanceFreeDrift((u=τua, v=τva), τo)
110+
end
111+
112+
return SeaIceMomentumEquation(grid;
113+
coriolis,
114+
top_momentum_stress = (u=τua, v=τva),
115+
bottom_momentum_stress = τo,
116+
rheology,
117+
solver)
118+
end
119+
120+
end

test/test_ocean_sea_ice_model.jl

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ using CUDA
44
using Oceananigans.OrthogonalSphericalShellGrids
55
using ClimaOcean.OceanSeaIceModels: above_freezing_ocean_temperature!
66
using ClimaSeaIce.SeaIceThermodynamics: melting_temperature
7-
using ClimaSeaIce.SeaIceMomentumEquations
7+
using ClimaSeaIce.SeaIceDynamics
88
using ClimaSeaIce.Rheologies
99

1010
@inline kernel_melting_temperature(i, j, k, grid, liquidus, S) = @inbounds melting_temperature(liquidus, S[i, j, k])
@@ -81,17 +81,7 @@ using ClimaSeaIce.Rheologies
8181
##### Coupled ocean-sea ice and prescribed atmosphere
8282
#####
8383

84-
# Adding a sea ice model to the coupled model
85-
τua = Field{Face, Center, Nothing}(grid)
86-
τva = Field{Center, Face, Nothing}(grid)
87-
88-
dynamics = SeaIceMomentumEquation(grid;
89-
coriolis = ocean.model.coriolis,
90-
top_momentum_stress = (u=τua, v=τva),
91-
rheology = ElastoViscoPlasticRheology(),
92-
solver = SplitExplicitSolver(120))
93-
94-
sea_ice = sea_ice_simulation(grid; dynamics, advection=WENO(order=7))
84+
sea_ice = sea_ice_simulation(grid, ocean; advection=WENO(order=7))
9585
liquidus = sea_ice.model.ice_thermodynamics.phase_transitions.liquidus
9686

9787
# Set the ocean temperature and salinity

test/test_surface_fluxes.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ using Oceananigans.TimeSteppers: update_state!
1818
using Oceananigans.Units: hours, days
1919
using ClimaOcean.DataWrangling: all_dates
2020

21-
using ClimaSeaIce.SeaIceMomentumEquations
21+
using ClimaSeaIce.SeaIceDynamics
2222
using ClimaSeaIce.Rheologies
2323

2424
import ClimaOcean.OceanSeaIceModels.InterfaceComputations: surface_specific_humidity

0 commit comments

Comments
 (0)