Skip to content
Open
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
7 changes: 7 additions & 0 deletions src/Models/AdvectedPopulations/PISCES/common.jl
Original file line number Diff line number Diff line change
Expand Up @@ -64,3 +64,10 @@ end

return min(1, max(0, 0.4 * (min_1 - O₂) / (min_2 + O₂)))
end

@inline function anoxia_factor(O₂ₘᵢₙ₁, O₂ₘᵢₙ₂, O₂)
min_1 = O₂ₘᵢₙ₁
min_2 = O₂ₘᵢₙ₂

return min(1, max(0, 0.4 * (min_1 - O₂) / (min_2 + O₂)))
end
Original file line number Diff line number Diff line change
Expand Up @@ -53,26 +53,58 @@ required_biogeochemical_tracers(::DissolvedOrganicCarbon) = tuple(:DOC)
- dissolved_breakdown - aggregation_to_particles)
end

@inline function degradation(dom::DissolvedOrganicCarbon, i, j, k, grid, bgc, clock, fields, auxiliary_fields)
@inline function degradation(dom::DissolvedOrganicCarbon, T, DOC, Bact, LBact)
Bact_ref = dom.reference_bacteria_concentration
b = dom.temperature_sensitivity
λ = dom.remineralisation_rate

f = b^T

return λ * f * LBact * Bact / Bact_ref * DOC # differes from Aumont 2015 since the dimensions don't make sense
end

@inline function degradation(dom::DissolvedOrganicCarbon, i, j, k, grid, bgc, clock, fields, auxiliary_fields)
T = @inbounds fields.T[i, j, k]
DOC = @inbounds fields.DOC[i, j, k]

f = b^T

Bact = bacteria_concentration(bgc.zooplankton, i, j, k, grid, bgc, clock, fields, auxiliary_fields)

LBact = bacteria_activity(bgc.zooplankton, i, j, k, grid, bgc, clock, fields, auxiliary_fields)

return λ * f * LBact * Bact / Bact_ref * DOC # differs from Aumont 2015 since the dimensions don't make sense
return degradation(dom, T, DOC, Bact, LBact)
end

@inline function aggregation(dom::DissolvedOrganicCarbon, i, j, k, grid, bgc, clock, fields, auxiliary_fields)
@inline function aggregation(a₁,
a₂,
a₃,
a₄,
a₅,
z,
zₘₓₗ,
background_shear,
mixed_layer_shear,
DOC,
POC,
GOC)

shear = ifelse(z < zₘₓₗ, background_shear, mixed_layer_shear)

Φ₁ = shear * (a₁ * DOC + a₂ * POC) * DOC
Φ₂ = shear * (a₃ * GOC) * DOC
Φ₃ = (a₄ * POC + a₅ * DOC) * DOC

return Φ₁ + Φ₂ + Φ₃, Φ₁, Φ₂, Φ₃
end

@inline function aggregation(dom::DissolvedOrganicCarbon, z, zₘₓₗ, background_shear, mixed_layer_shear, DOC, POC, GOC)
a₁, a₂, a₃, a₄, a₅ = dom.aggregation_parameters

return aggregation(a₁, a₂, a₃, a₄, a₅,
z, zₘₓₗ, background_shear, mixed_layer_shear,
DOC, POC, GOC)
end

@inline function aggregation(dom::DissolvedOrganicCarbon, i, j, k, grid, bgc, clock, fields, auxiliary_fields)
background_shear = bgc.background_shear
mixed_layer_shear = bgc.mixed_layer_shear

Expand All @@ -84,31 +116,100 @@ end
POC = @inbounds fields.POC[i, j, k]
GOC = @inbounds fields.GOC[i, j, k]

shear = ifelse(z < zₘₓₗ, background_shear, mixed_layer_shear)

Φ₁ = shear * (a₁ * DOC + a₂ * POC) * DOC
Φ₂ = shear * (a₃ * GOC) * DOC
Φ₃ = (a₄ * POC + a₅ * DOC) * DOC

return Φ₁ + Φ₂ + Φ₃, Φ₁, Φ₂, Φ₃
return aggregation(dom, z, zₘₓₗ, background_shear, mixed_layer_shear, DOC, POC, GOC)
end

@inline function aggregation_of_colloidal_iron(dom::DissolvedOrganicCarbon, i, j, k, grid, bgc, clock, fields, auxiliary_fields)
_, Φ₁, Φ₂, Φ₃ = aggregation(dom, i, j, k, grid, bgc, clock, fields, auxiliary_fields)

Fe = @inbounds fields.Fe[i, j, k]
DOC = @inbounds fields.DOC[i, j, k]
@inline function aggregation_of_colloidal_iron(a₁,
a₂,
a₃,
a₄,
a₅,
background_shear,
mixed_layer_shear,
z,
zₘₓₗ,
Fe,
Fe′,
DOC,
POC,
GOC)

_, Φ₁, Φ₂, Φ₃ = aggregation(a₁,
a₂,
a₃,
a₄,
a₅,
z,
zₘₓₗ,
background_shear,
mixed_layer_shear,
DOC,
POC,
GOC)

Fe′ = free_iron(bgc.iron, i, j, k, grid, bgc, clock, fields, auxiliary_fields)
ligand_iron = Fe - Fe′
colloidal_iron = 0.5 * ligand_iron

CgFe1 = (Φ₁ + Φ₃) * colloidal_iron / (DOC + eps(0.0))
CgFe2 = Φ₂ * colloidal_iron / (DOC + eps(0.0))

return CgFe1 + CgFe2, CgFe1, CgFe2
end

@inline function aggregation_of_colloidal_iron(dom::DissolvedOrganicCarbon,
background_shear,
mixed_layer_shear,
z,
zₘₓₗ,
Fe,
Fe′,
DOC,
POC,
GOC)

a₁, a₂, a₃, a₄, a₅ = dom.aggregation_parameters

return aggregation_of_colloidal_iron(a₁, a₂, a₃, a₄, a₅,
background_shear,
mixed_layer_shear,
z,
zₘₓₗ,
Fe,
Fe′,
DOC,
POC,
GOC)
end

@inline function aggregation_of_colloidal_iron(dom::DissolvedOrganicCarbon, i, j, k, grid, bgc, clock, fields, auxiliary_fields)

background_shear = bgc.background_shear
mixed_layer_shear = bgc.mixed_layer_shear

z = znode(i, j, k, grid, Center(), Center(), Center())

zₘₓₗ = @inbounds auxiliary_fields.zₘₓₗ[i, j, k]


Fe = @inbounds fields.Fe[i, j, k]
Fe′ = free_iron(bgc.iron, i, j, k, grid, bgc, clock, fields, auxiliary_fields)

DOC = @inbounds fields.DOC[i, j, k]
POC = @inbounds fields.POC[i, j, k]
GOC = @inbounds fields.GOC[i, j, k]


return aggregation_of_colloidal_iron(dom,
background_shear,
mixed_layer_shear,
z,
zₘₓₗ,
Fe,
Fe′,
DOC,
POC,
GOC)
end

@inline function oxic_remineralisation(dom::DissolvedOrganicCarbon, i, j, k, grid, bgc, clock, fields, auxiliary_fields)
O₂ = @inbounds fields.O₂[i, j, k]

Expand Down
38 changes: 29 additions & 9 deletions src/Models/AdvectedPopulations/PISCES/iron/iron.jl
Original file line number Diff line number Diff line change
@@ -1,39 +1,59 @@
module Iron

export SimpleIron
export SimpleIron, IronTendencyArgs

using Oceananigans.Units
using Oceananigans.Grids: znode, Center

using OceanBioME.Models.PISCESModel: PISCES
using OceanBioME.Models.PISCESModel: PISCES, anoxia_factor

using OceanBioME.Models.PISCESModel.DissolvedOrganicMatter:
aggregation_of_colloidal_iron, degradation

using OceanBioME.Models.PISCESModel.ParticulateOrganicMatter:
iron_scavenging, iron_scavenging_rate, bacterial_iron_uptake
iron_scavenging, iron_scavenging_rate, bacterial_iron_uptake,
specific_degradation_rate, edible_flux_rate, edible_iron_flux_rate

using OceanBioME.Models.PISCESModel.Phytoplankton: uptake

using OceanBioME.Models.PISCESModel.Zooplankton:
non_assimilated_iron, upper_trophic_dissolved_iron
non_assimilated_iron, upper_trophic_dissolved_iron,
bacteria_concentration, bacteria_activity

import Oceananigans.Biogeochemistry: required_biogeochemical_tracers
import OceanBioME.Models.PISCESModel: free_iron

include("simple_iron.jl")

@inline function free_iron(::SimpleIron, i, j, k, grid, bgc, clock, fields, auxiliary_fields)
DOC = @inbounds fields.DOC[i, j, k]
Fe = @inbounds fields.Fe[i, j, k]
@inline function ligand_concentration(iron::SimpleIron, DOC)
Lₜᵐᵃˣ = iron.maximum_ligand_concentration
Lₜ = iron.dissolved_ligand_ratio * DOC - Lₜᵐᵃˣ

return max(Lₜᵐᵃˣ, Lₜ)
end

T = @inbounds fields.T[i, j, k]
@inline function ligand_aggregation(iron::SimpleIron, Fe, DOC, T, scavenging_rate)
Lₜ = ligand_concentration(iron, DOC)
Fe′ = free_iron(iron, Fe, DOC, T)
ΔFe = max(zero(Fe), Fe - Lₜ)

return iron.excess_scavenging_enhancement * scavenging_rate * ΔFe * Fe′
end

# maybe some of these numbers should be parameters
@inline function free_iron(::SimpleIron, Fe, DOC, T)
ligands = max(0.6, 0.09 * (DOC + 40) - 3)
K = exp(16.27 - 1565.7 / max(T + 273.15, 5))
Δ = 1 + K * ligands - K * Fe

return (-Δ + √(Δ^2 + 4K * Fe)) / 2K
end

@inline function free_iron(iron::SimpleIron, i, j, k, grid, bgc, clock, fields, auxiliary_fields)
DOC = @inbounds fields.DOC[i, j, k]
Fe = @inbounds fields.Fe[i, j, k]
T = @inbounds fields.T[i, j, k]

return free_iron(iron, Fe, DOC, T)
end

end # module
Loading