Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 1 addition & 3 deletions src/Diagnostics/Diagnostics.jl
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,7 @@ module Diagnostics

export MixedLayerDepthField, MixedLayerDepthOperand
export meridional_heat_transport
export frazil_temperature_flux, net_ocean_temperature_flux, sea_ice_ocean_temperature_flux, atmosphere_ocean_temperature_flux,
frazil_heat_flux, net_ocean_heat_flux, sea_ice_ocean_heat_flux, atmosphere_ocean_heat_flux,
net_ocean_salinity_flux, sea_ice_ocean_salinity_flux, atmosphere_ocean_salinity_flux,
export net_ocean_heat_flux, sea_ice_ocean_heat_flux, atmosphere_ocean_heat_flux,
net_ocean_freshwater_flux, sea_ice_ocean_freshwater_flux, atmosphere_ocean_freshwater_flux

using KernelAbstractions: @index, @kernel
Expand Down
75 changes: 27 additions & 48 deletions src/Diagnostics/interface_fluxes.jl
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,10 @@ Return the two-dimensional frazil temperature flux (K m s⁻¹) in a coupled `es
function frazil_temperature_flux(esm::EarthSystemModel)
ρᵒᶜ = esm.interfaces.ocean_properties.reference_density
cᵒᶜ = esm.interfaces.ocean_properties.heat_capacity
frazil_temperature_flux = 1 / (ρᵒᶜ * cᵒᶜ) * frazil_heat_flux(esm)
return Field(frazil_temperature_flux)
return 1 / (ρᵒᶜ * cᵒᶜ) * frazil_heat_flux(esm)
end

frazil_temperature_flux(esm::NoSeaIceOceanInterfaceModel) = ZeroField()
frazil_temperature_flux(::NoSeaIceOceanInterfaceModel) = ZeroField()

"""
net_ocean_temperature_flux(esm::EarthSystemModel)
Expand All @@ -32,8 +31,7 @@ Return the net temperature flux (K m s⁻¹) at the ocean's surface in a coupled
"""
function net_ocean_temperature_flux(esm::EarthSystemModel)
Jᵀ = flux_field(esm.ocean.model.tracers.T.boundary_conditions.top.condition)
net_ocean_temperature_flux = Jᵀ + frazil_temperature_flux(esm)
return Field(net_ocean_temperature_flux)
return Jᵀ + frazil_temperature_flux(esm)
end


Expand All @@ -46,23 +44,19 @@ in a coupled `esm`.
function sea_ice_ocean_temperature_flux(esm::EarthSystemModel)
ρᵒᶜ = esm.interfaces.ocean_properties.reference_density
cᵒᶜ = esm.interfaces.ocean_properties.heat_capacity
sea_ice_ocean_temperature_flux = 1 / (ρᵒᶜ * cᵒᶜ) * sea_ice_ocean_heat_flux(esm)
return Field(sea_ice_ocean_temperature_flux)
return 1 / (ρᵒᶜ * cᵒᶜ) * sea_ice_ocean_heat_flux(esm)
end

sea_ice_ocean_temperature_flux(esm::NoSeaIceOceanInterfaceModel) = ZeroField()
sea_ice_ocean_temperature_flux(::NoSeaIceOceanInterfaceModel) = ZeroField()

"""
atmosphere_ocean_temperature_flux(esm::EarthSystemModel)

Return the atmosphere-ocean temperature flux (K m s⁻¹) at the atmosphere-ocean
interface in a coupled `esm`.
"""
function atmosphere_ocean_temperature_flux(esm::EarthSystemModel)
atmosphere_ocean_temperature_flux =
atmosphere_ocean_temperature_flux(esm::EarthSystemModel) =
net_ocean_temperature_flux(esm) - sea_ice_ocean_temperature_flux(esm)
return Field(atmosphere_ocean_temperature_flux)
end


###########################
Expand All @@ -74,12 +68,10 @@ end

Return the two-dimensional frazil heat flux (W m⁻²) in a coupled `esm`.
"""
function frazil_heat_flux(esm::EarthSystemModel)
frazil_heat_flux = esm.interfaces.sea_ice_ocean_interface.fluxes.frazil_heat
return frazil_heat_flux
end
frazil_heat_flux(esm::EarthSystemModel) =
esm.interfaces.sea_ice_ocean_interface.fluxes.frazil_heat

frazil_heat_flux(esm::NoSeaIceOceanInterfaceModel) = ZeroField()
frazil_heat_flux(::NoSeaIceOceanInterfaceModel) = ZeroField()

"""
net_ocean_heat_flux(esm::EarthSystemModel)
Expand All @@ -89,8 +81,7 @@ Return the net heat flux (W m⁻²) at the ocean's surface in a coupled `esm`.
function net_ocean_heat_flux(esm::EarthSystemModel)
ρᵒᶜ = esm.interfaces.ocean_properties.reference_density
cᵒᶜ = esm.interfaces.ocean_properties.heat_capacity
net_ocean_heat_flux = ρᵒᶜ * cᵒᶜ * net_ocean_temperature_flux(esm)
return Field(net_ocean_heat_flux)
return ρᵒᶜ * cᵒᶜ * net_ocean_temperature_flux(esm)
end

"""
Expand All @@ -101,11 +92,10 @@ in a coupled `esm`.
"""
function sea_ice_ocean_heat_flux(esm::EarthSystemModel)
sea_ice_ocean_fluxes = esm.interfaces.sea_ice_ocean_interface.fluxes
sea_ice_ocean_heat_flux = sea_ice_ocean_fluxes.interface_heat + frazil_heat_flux(esm)
return Field(sea_ice_ocean_heat_flux)
return sea_ice_ocean_fluxes.interface_heat + frazil_heat_flux(esm)
end

sea_ice_ocean_heat_flux(esm::NoSeaIceOceanInterfaceModel) = ZeroField()
sea_ice_ocean_heat_flux(::NoSeaIceOceanInterfaceModel) = ZeroField()

"""
atmosphere_ocean_heat_flux(esm::EarthSystemModel)
Expand All @@ -116,8 +106,7 @@ interface in a coupled `esm`.
function atmosphere_ocean_heat_flux(esm::EarthSystemModel)
ρᵒᶜ = esm.interfaces.ocean_properties.reference_density
cᵒᶜ = esm.interfaces.ocean_properties.heat_capacity
atmosphere_ocean_heat_flux = ρᵒᶜ * cᵒᶜ * atmosphere_ocean_temperature_flux(esm)
return Field(atmosphere_ocean_heat_flux)
return ρᵒᶜ * cᵒᶜ * atmosphere_ocean_temperature_flux(esm)
end


Expand All @@ -130,10 +119,8 @@ end

Return the net salinity flux (g/kg m s⁻¹) at the ocean's surface in a coupled `esm`.
"""
function net_ocean_salinity_flux(esm::EarthSystemModel)
Jˢ = flux_field(esm.ocean.model.tracers.S.boundary_conditions.top.condition)
return Jˢ
end
net_ocean_salinity_flux(esm::EarthSystemModel) =
flux_field(esm.ocean.model.tracers.S.boundary_conditions.top.condition)


"""
Expand All @@ -142,24 +129,19 @@ end
Return the sea ice-ocean salinity flux (g/kg m s⁻¹) at the sea ice-ocean interface
in a coupled `esm`.
"""
function sea_ice_ocean_salinity_flux(esm::EarthSystemModel)
sea_ice_ocean_salinity_flux = esm.interfaces.sea_ice_ocean_interface.fluxes.salt
return sea_ice_ocean_salinity_flux
end
sea_ice_ocean_salinity_flux(esm::EarthSystemModel) =
esm.interfaces.sea_ice_ocean_interface.fluxes.salt

sea_ice_ocean_salinity_flux(esm::NoSeaIceOceanInterfaceModel) = ZeroField()
sea_ice_ocean_salinity_flux(::NoSeaIceOceanInterfaceModel) = ZeroField()

"""
atmosphere_ocean_salinity_flux(esm::EarthSystemModel)

Return the atmosphere-ocean salinity flux (g/kg m s⁻¹) at the atmosphere-ocean
interface in a coupled `esm`.
"""
function atmosphere_ocean_salinity_flux(esm::EarthSystemModel)
atmosphere_ocean_salinity_flux =
net_ocean_salinity_flux(esm) - sea_ice_ocean_salinity_flux(esm)
return Field(atmosphere_ocean_salinity_flux)
end
atmosphere_ocean_salinity_flux(esm::EarthSystemModel) =
net_ocean_salinity_flux(esm) - sea_ice_ocean_salinity_flux(esm)


###########################
Expand All @@ -173,9 +155,8 @@ Return the net freshwater mass flux (kg m⁻² s⁻¹) at the ocean's surface in
"""
function net_ocean_freshwater_flux(esm::EarthSystemModel; reference_salinity = 35)
ρᵒᶜ = esm.interfaces.ocean_properties.reference_density
S₀ = convert(typeof(ρᵒᶜ), reference_salinity)
net_ocean_frashwater_flux = - ρᵒᶜ / S₀ * net_ocean_salinity_flux(esm)
return Field(net_ocean_frashwater_flux)
Sᵒᶜ = convert(typeof(ρᵒᶜ), reference_salinity)
return - ρᵒᶜ / Sᵒᶜ * net_ocean_salinity_flux(esm)
end

"""
Expand All @@ -186,12 +167,11 @@ in a coupled `esm`.
"""
function sea_ice_ocean_freshwater_flux(esm::EarthSystemModel; reference_salinity = 35)
ρᵒᶜ = esm.interfaces.ocean_properties.reference_density
S₀ = convert(typeof(ρᵒᶜ), reference_salinity)
sea_ice_ocean_freshwater_flux = - ρᵒᶜ / S₀ * sea_ice_ocean_salinity_flux(esm)
return Field(sea_ice_ocean_freshwater_flux)
Sᵒᶜ = convert(typeof(ρᵒᶜ), reference_salinity)
return - ρᵒᶜ / Sᵒᶜ * sea_ice_ocean_salinity_flux(esm)
end

sea_ice_ocean_freshwater_flux(esm::NoSeaIceOceanInterfaceModel; kwargs...) = ZeroField()
sea_ice_ocean_freshwater_flux(::NoSeaIceOceanInterfaceModel; kwargs...) = ZeroField()

"""
atmosphere_ocean_freshwater_flux(esm::EarthSystemModel)
Expand All @@ -201,7 +181,6 @@ interface in a coupled `esm`.
"""
function atmosphere_ocean_freshwater_flux(esm::EarthSystemModel; reference_salinity = 35)
ρᵒᶜ = esm.interfaces.ocean_properties.reference_density
S₀ = convert(typeof(ρᵒᶜ), reference_salinity)
atmosphere_ocean_freshwater_flux = - ρᵒᶜ / S₀ * atmosphere_ocean_salinity_flux(esm)
return Field(atmosphere_ocean_freshwater_flux)
Sᵒᶜ = convert(typeof(ρᵒᶜ), reference_salinity)
return - ρᵒᶜ / Sᵒᶜ * atmosphere_ocean_salinity_flux(esm)
end
4 changes: 1 addition & 3 deletions src/NumericalEarth.jl
Original file line number Diff line number Diff line change
Expand Up @@ -94,9 +94,7 @@ export
default_sea_ice,
sea_ice_dynamics,
initialize!,
frazil_temperature_flux, net_ocean_temperature_flux, sea_ice_ocean_temperature_flux, atmosphere_ocean_temperature_flux,
frazil_heat_flux, net_ocean_heat_flux, sea_ice_ocean_heat_flux, atmosphere_ocean_heat_flux,
net_ocean_salinity_flux, sea_ice_ocean_salinity_flux, atmosphere_ocean_salinity_flux,
net_ocean_heat_flux, sea_ice_ocean_heat_flux, atmosphere_ocean_heat_flux,
net_ocean_freshwater_flux, sea_ice_ocean_freshwater_flux, atmosphere_ocean_freshwater_flux,
meridional_heat_transport,
location,
Expand Down
25 changes: 15 additions & 10 deletions test/test_diagnostics_2.jl
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
include("runtests_setup.jl")

using NumericalEarth.Diagnostics: Diagnostics

for arch in test_architectures
A = typeof(arch)
@info "Testing InterfaceFluxOutputs [$A]..."
Expand All @@ -15,8 +17,8 @@ for arch in test_architectures
interface_heat_flux_value = 0.3
sea_ice_ocean_salt_flux_value = 0.9

model_configurations = ((name = "OceanSeaIceModel", with_sea_ice = true),
(name = "OceanOnlyModel", with_sea_ice = false))
model_configurations = ((name = "OceanOnlyModel", with_sea_ice = false),
(name = "OceanSeaIceModel", with_sea_ice = true))

for config in model_configurations
@testset "InterfaceFluxOutputs on $(config.name) [$A]" begin
Expand Down Expand Up @@ -54,21 +56,24 @@ for arch in test_architectures
cᵒᶜ = esm.interfaces.ocean_properties.heat_capacity
Sᵒᶜ = 35.0

frazil_temperature = frazil_temperature_flux(esm)
net_ocean_temperature = net_ocean_temperature_flux(esm)
sea_ice_ocean_temperature = sea_ice_ocean_temperature_flux(esm)
atmosphere_ocean_temperature = atmosphere_ocean_temperature_flux(esm)
frazil_heat = frazil_heat_flux(esm)
# exported diagnostics
net_ocean_heat = net_ocean_heat_flux(esm)
sea_ice_ocean_heat = sea_ice_ocean_heat_flux(esm)
atmosphere_ocean_heat = atmosphere_ocean_heat_flux(esm)
net_ocean_salinity = net_ocean_salinity_flux(esm)
sea_ice_ocean_salinity = sea_ice_ocean_salinity_flux(esm)
atmosphere_ocean_salinity = atmosphere_ocean_salinity_flux(esm)
net_ocean_freshwater = net_ocean_freshwater_flux(esm; reference_salinity = Sᵒᶜ)
sea_ice_ocean_freshwater = sea_ice_ocean_freshwater_flux(esm; reference_salinity = Sᵒᶜ)
atmosphere_ocean_freshwater = atmosphere_ocean_freshwater_flux(esm; reference_salinity = Sᵒᶜ)

# internal diagnostics
frazil_temperature = Diagnostics.frazil_temperature_flux(esm)
net_ocean_temperature = Diagnostics.net_ocean_temperature_flux(esm)
sea_ice_ocean_temperature = Diagnostics.sea_ice_ocean_temperature_flux(esm)
atmosphere_ocean_temperature = Diagnostics.atmosphere_ocean_temperature_flux(esm)
frazil_heat = Diagnostics.frazil_heat_flux(esm)
net_ocean_salinity = Diagnostics.net_ocean_salinity_flux(esm)
sea_ice_ocean_salinity = Diagnostics.sea_ice_ocean_salinity_flux(esm)
atmosphere_ocean_salinity = Diagnostics.atmosphere_ocean_salinity_flux(esm)

for f in (frazil_temperature, net_ocean_temperature, sea_ice_ocean_temperature,
atmosphere_ocean_temperature, frazil_heat, net_ocean_heat, sea_ice_ocean_heat,
atmosphere_ocean_heat, net_ocean_salinity, sea_ice_ocean_salinity,
Expand Down
Loading