From 9a34b35746b76b5f21785e74a2d743cf93a03681 Mon Sep 17 00:00:00 2001 From: Jago Strong-Wright Date: Fri, 23 Aug 2024 17:45:46 +0100 Subject: [PATCH 1/3] fixed boundaries thing --- src/Models/AdvectedPopulations/PISCES/PISCES.jl | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/Models/AdvectedPopulations/PISCES/PISCES.jl b/src/Models/AdvectedPopulations/PISCES/PISCES.jl index 388bc51d9..d5d3ce285 100644 --- a/src/Models/AdvectedPopulations/PISCES/PISCES.jl +++ b/src/Models/AdvectedPopulations/PISCES/PISCES.jl @@ -47,11 +47,11 @@ using Oceananigans.Fields: Field, TracerFields, CenterField, ZeroField, Constant using OceanBioME.Light: TwoBandPhotosyntheticallyActiveRadiation, default_surface_PAR using OceanBioME: setup_velocity_fields, show_sinking_velocities, Biogeochemistry, ScaleNegativeTracers using OceanBioME.BoxModels: BoxModel -using OceanBioME.Boundaries.Sediments: sinking_flux using Oceananigans.Biogeochemistry: AbstractContinuousFormBiogeochemistry -import OceanBioME: redfield, conserved_tracers +import OceanBioME: redfield, conserved_tracers, maximum_sinking_velocity, chlorophyll +import OceanBioME.Models.Sediments: nitrogen_flux, carbon_flux, remineralisation_receiver, sinking_tracers # these need to be defined for PISCES import Oceananigans.Biogeochemistry: required_biogeochemical_tracers, required_biogeochemical_auxiliary_fields, @@ -63,8 +63,6 @@ import OceanBioME: maximum_sinking_velocity import Adapt: adapt_structure, adapt import Base: show, summary -import OceanBioME.Boundaries.Sediments: nitrogen_flux, carbon_flux, remineralisation_receiver, sinking_tracers - struct PISCES{FT, PD, ZM, OT, W, CF, ZF} <: AbstractContinuousFormBiogeochemistry growth_rate_at_zero :: FT # add list of parameters here, assuming theyre all just numbers FT will be fine for advect_particles_kernel From 978eef9a70d7a3f1a7010ff3c7789959a3c76f14 Mon Sep 17 00:00:00 2001 From: Jago Strong-Wright Date: Fri, 23 Aug 2024 17:56:10 +0100 Subject: [PATCH 2/3] super to sub script for par names --- src/Models/AdvectedPopulations/PISCES/DOC.jl | 6 ++-- .../AdvectedPopulations/PISCES/PISCES.jl | 2 +- .../AdvectedPopulations/PISCES/POC_and_GOC.jl | 4 +-- .../AdvectedPopulations/PISCES/calcite.jl | 2 +- .../PISCES/carbonate_system.jl | 12 +++---- src/Models/AdvectedPopulations/PISCES/iron.jl | 2 +- .../PISCES/iron_in_particles.jl | 4 +-- .../PISCES/nitrates_ammonium.jl | 12 +++---- .../AdvectedPopulations/PISCES/oxygen.jl | 6 ++-- .../AdvectedPopulations/PISCES/phosphates.jl | 6 ++-- .../PISCES/phytoplankton.jl | 32 +++++++++---------- src/Models/AdvectedPopulations/PISCES/psi.jl | 2 +- src/Models/AdvectedPopulations/PISCES/si.jl | 4 +-- .../AdvectedPopulations/PISCES/zooplankton.jl | 4 +-- validation/PISCES/columnPISCES.jl | 14 ++++---- 15 files changed, 55 insertions(+), 57 deletions(-) diff --git a/src/Models/AdvectedPopulations/PISCES/DOC.jl b/src/Models/AdvectedPopulations/PISCES/DOC.jl index e6dc161b6..6012b6102 100644 --- a/src/Models/AdvectedPopulations/PISCES/DOC.jl +++ b/src/Models/AdvectedPopulations/PISCES/DOC.jl @@ -92,7 +92,7 @@ end end #Forcing for DOC -@inline function (bgc::PISCES)(::Val{:DOC}, x, y, z, t, P, D, Z, M, Pᶜʰˡ, Dᶜʰˡ, Pᶠᵉ, Dᶠᵉ, Dˢⁱ, DOC, POC, GOC, SFe, BFe, PSi, NO₃, NH₄, PO₄, Fe, Si, CaCO₃, DIC, Alk, O₂, T, zₘₓₗ, zₑᵤ, Si̅, D_dust, Ω, PAR, PAR¹, PAR², PAR³) +@inline function (bgc::PISCES)(::Val{:DOC}, x, y, z, t, P, D, Z, M, Pᶜʰˡ, Dᶜʰˡ, Pᶠᵉ, Dᶠᵉ, Dˢⁱ, DOC, POC, GOC, SFe, BFe, PSi, NO₃, NH₄, PO₄, Fe, Si, CaCO₃, DIC, Alk, O₂, T, zₘₓₗ, zₑᵤ, Si̅, D_dust, Ω, PAR, PAR₁, PAR₂, PAR₃) γᶻ = bgc.excretion_as_DOM.Z γᴹ = bgc.excretion_as_DOM.M σᶻ = bgc.non_assimilated_fraction.Z @@ -124,8 +124,8 @@ end t_darkᴾ = bgc.mean_residence_time_of_phytoplankton_in_unlit_mixed_layer.P t_darkᴰ = bgc.mean_residence_time_of_phytoplankton_in_unlit_mixed_layer.D - PARᴾ = P_PAR(PAR¹, PAR², PAR³, bgc) - PARᴰ = D_PAR(PAR¹, PAR², PAR³, bgc) + PARᴾ = P_PAR(PAR₁, PAR₂, PAR₃, bgc) + PARᴰ = D_PAR(PAR₁, PAR₂, PAR₃, bgc) Lₗᵢₘᴾ = P_nutrient_limitation(P, PO₄, NO₃, NH₄, Pᶜʰˡ, Pᶠᵉ, bgc)[1] Lₗᵢₘᴰ = D_nutrient_limitation(D, PO₄, NO₃, NH₄, Si, Dᶜʰˡ, Dᶠᵉ, Si̅, bgc)[1] diff --git a/src/Models/AdvectedPopulations/PISCES/PISCES.jl b/src/Models/AdvectedPopulations/PISCES/PISCES.jl index d5d3ce285..58edecdc0 100644 --- a/src/Models/AdvectedPopulations/PISCES/PISCES.jl +++ b/src/Models/AdvectedPopulations/PISCES/PISCES.jl @@ -892,7 +892,7 @@ end @inline required_biogeochemical_tracers(::PISCES) = (:P, :D, :Z, :M, :Pᶜʰˡ, :Dᶜʰˡ, :Pᶠᵉ, :Dᶠᵉ, :Dˢⁱ, :DOC, :POC, :GOC, :SFe, :BFe, :PSi, :NO₃, :NH₄, :PO₄, :Fe, :Si, :CaCO₃, :DIC, :Alk, :O₂, :T) # list all the parameters here, also if you need T and S put them here too -@inline required_biogeochemical_auxiliary_fields(::PISCES) = (:zₘₓₗ, :zₑᵤ, :Si̅, :D_dust, :Ω, :PAR, :PAR¹, :PAR², :PAR³, ) +@inline required_biogeochemical_auxiliary_fields(::PISCES) = (:zₘₓₗ, :zₑᵤ, :Si̅, :D_dust, :Ω, :PAR, :PAR₁, :PAR₂, :PAR₃, ) # for sinking things like POM this is how we tell oceananigans ther sinking speed @inline function biogeochemical_drift_velocity(bgc::PISCES, ::Val{tracer_name}) where tracer_name diff --git a/src/Models/AdvectedPopulations/PISCES/POC_and_GOC.jl b/src/Models/AdvectedPopulations/PISCES/POC_and_GOC.jl index 2ba7d8d6d..a42709c20 100644 --- a/src/Models/AdvectedPopulations/PISCES/POC_and_GOC.jl +++ b/src/Models/AdvectedPopulations/PISCES/POC_and_GOC.jl @@ -17,7 +17,7 @@ end #Forcing for POC -@inline function (bgc::PISCES)(::Val{:POC}, x, y, z, t, P, D, Z, M, Pᶜʰˡ, Dᶜʰˡ, Pᶠᵉ, Dᶠᵉ, Dˢⁱ, DOC, POC, GOC, SFe, BFe, PSi, NO₃, NH₄, PO₄, Fe, Si, CaCO₃, DIC, Alk, O₂, T, zₘₓₗ, zₑᵤ, Si̅, D_dust, Ω, PAR, PAR¹, PAR², PAR³) +@inline function (bgc::PISCES)(::Val{:POC}, x, y, z, t, P, D, Z, M, Pᶜʰˡ, Dᶜʰˡ, Pᶠᵉ, Dᶠᵉ, Dˢⁱ, DOC, POC, GOC, SFe, BFe, PSi, NO₃, NH₄, PO₄, Fe, Si, CaCO₃, DIC, Alk, O₂, T, zₘₓₗ, zₑᵤ, Si̅, D_dust, Ω, PAR, PAR₁, PAR₂, PAR₃) #Parameters σᶻ = bgc.non_assimilated_fraction.Z mᴾ, mᴰ = bgc.phytoplankton_mortality_rate @@ -52,7 +52,7 @@ end end #Forcing for GOC -@inline function (bgc::PISCES)(::Val{:GOC}, x, y, z, t, P, D, Z, M, Pᶜʰˡ, Dᶜʰˡ, Pᶠᵉ, Dᶠᵉ, Dˢⁱ, DOC, POC, GOC, SFe, BFe, PSi, NO₃, NH₄, PO₄, Fe, Si, CaCO₃, DIC, Alk, O₂, T, zₘₓₗ, zₑᵤ, Si̅, D_dust, Ω, PAR, PAR¹, PAR², PAR³) +@inline function (bgc::PISCES)(::Val{:GOC}, x, y, z, t, P, D, Z, M, Pᶜʰˡ, Dᶜʰˡ, Pᶠᵉ, Dᶠᵉ, Dˢⁱ, DOC, POC, GOC, SFe, BFe, PSi, NO₃, NH₄, PO₄, Fe, Si, CaCO₃, DIC, Alk, O₂, T, zₘₓₗ, zₑᵤ, Si̅, D_dust, Ω, PAR, PAR₁, PAR₂, PAR₃) #Parameters σᴹ = bgc.non_assimilated_fraction.M mᴾ, mᴰ = bgc.phytoplankton_mortality_rate diff --git a/src/Models/AdvectedPopulations/PISCES/calcite.jl b/src/Models/AdvectedPopulations/PISCES/calcite.jl index a1fe702a8..dd0ae6f09 100644 --- a/src/Models/AdvectedPopulations/PISCES/calcite.jl +++ b/src/Models/AdvectedPopulations/PISCES/calcite.jl @@ -44,7 +44,7 @@ end end #Forcing for calcite -@inline function (bgc::PISCES)(::Val{:CaCO₃}, x, y, z, t, P, D, Z, M, Pᶜʰˡ, Dᶜʰˡ, Pᶠᵉ, Dᶠᵉ, Dˢⁱ, DOC, POC, GOC, SFe, BFe, PSi, NO₃, NH₄, PO₄, Fe, Si, CaCO₃, DIC, Alk, O₂, T, zₘₓₗ, zₑᵤ, Si̅, D_dust, Ω, PAR, PAR¹, PAR², PAR³) +@inline function (bgc::PISCES)(::Val{:CaCO₃}, x, y, z, t, P, D, Z, M, Pᶜʰˡ, Dᶜʰˡ, Pᶠᵉ, Dᶠᵉ, Dˢⁱ, DOC, POC, GOC, SFe, BFe, PSi, NO₃, NH₄, PO₄, Fe, Si, CaCO₃, DIC, Alk, O₂, T, zₘₓₗ, zₑᵤ, Si̅, D_dust, Ω, PAR, PAR₁, PAR₂, PAR₃) return (production_of_sinking_calcite(P, PO₄, NO₃, NH₄, Pᶜʰˡ, Pᶠᵉ, Fe, D, Z, M, POC, T, PAR, zₘₓₗ, z, bgc) - dissolution_of_calcite(CaCO₃, bgc, Ω)*CaCO₃) #eq75, partial derivative omitted as sinking is accounted for in other parts of model diff --git a/src/Models/AdvectedPopulations/PISCES/carbonate_system.jl b/src/Models/AdvectedPopulations/PISCES/carbonate_system.jl index 795fca649..ea5c1d6b8 100644 --- a/src/Models/AdvectedPopulations/PISCES/carbonate_system.jl +++ b/src/Models/AdvectedPopulations/PISCES/carbonate_system.jl @@ -4,7 +4,7 @@ #DIC is significant as required by phytoplankton for photosynthesis, and by calcifying organisms for calcite shells. -@inline function (bgc::PISCES)(::Val{:DIC}, x, y, z, t, P, D, Z, M, Pᶜʰˡ, Dᶜʰˡ, Pᶠᵉ, Dᶠᵉ, Dˢⁱ, DOC, POC, GOC, SFe, BFe, PSi, NO₃, NH₄, PO₄, Fe, Si, CaCO₃, DIC, Alk, O₂, T, zₘₓₗ, zₑᵤ, Si̅, D_dust, Ω, PAR, PAR¹, PAR², PAR³) +@inline function (bgc::PISCES)(::Val{:DIC}, x, y, z, t, P, D, Z, M, Pᶜʰˡ, Dᶜʰˡ, Pᶠᵉ, Dᶠᵉ, Dˢⁱ, DOC, POC, GOC, SFe, BFe, PSi, NO₃, NH₄, PO₄, Fe, Si, CaCO₃, DIC, Alk, O₂, T, zₘₓₗ, zₑᵤ, Si̅, D_dust, Ω, PAR, PAR₁, PAR₂, PAR₃) #Parameters γᶻ, γᴹ = bgc.excretion_as_DOM σᶻ, σᴹ = bgc.non_assimilated_fraction @@ -30,8 +30,8 @@ t_darkᴾ = bgc.mean_residence_time_of_phytoplankton_in_unlit_mixed_layer.P t_darkᴰ = bgc.mean_residence_time_of_phytoplankton_in_unlit_mixed_layer.D - PARᴾ = P_PAR(PAR¹, PAR², PAR³, bgc) - PARᴰ = D_PAR(PAR¹, PAR², PAR³, bgc) + PARᴾ = P_PAR(PAR₁, PAR₂, PAR₃, bgc) + PARᴰ = D_PAR(PAR₁, PAR₂, PAR₃, bgc) Lₗᵢₘᴾ = P_nutrient_limitation(P, PO₄, NO₃, NH₄, Pᶜʰˡ, Pᶠᵉ, bgc)[1] Lₗᵢₘᴰ = D_nutrient_limitation(D, PO₄, NO₃, NH₄, Si, Dᶜʰˡ, Dᶠᵉ, Si̅, bgc)[1] @@ -51,7 +51,7 @@ μᴰ*D - μᴾ*P) #eq59 end -@inline function (bgc::PISCES)(::Val{:Alk}, x, y, z, t, P, D, Z, M, Pᶜʰˡ, Dᶜʰˡ, Pᶠᵉ, Dᶠᵉ, Dˢⁱ, DOC, POC, GOC, SFe, BFe, PSi, NO₃, NH₄, PO₄, Fe, Si, CaCO₃, DIC, Alk, O₂, T, zₘₓₗ, zₑᵤ, Si̅, D_dust, Ω, PAR, PAR¹, PAR², PAR³) # eq59 +@inline function (bgc::PISCES)(::Val{:Alk}, x, y, z, t, P, D, Z, M, Pᶜʰˡ, Dᶜʰˡ, Pᶠᵉ, Dᶠᵉ, Dˢⁱ, DOC, POC, GOC, SFe, BFe, PSi, NO₃, NH₄, PO₄, Fe, Si, CaCO₃, DIC, Alk, O₂, T, zₘₓₗ, zₑᵤ, Si̅, D_dust, Ω, PAR, PAR₁, PAR₂, PAR₃) # eq59 #Parameters θᴺᶜ = bgc.NC_redfield_ratio rₙₒ₃¹ = bgc. CN_ratio_of_denitrification @@ -79,8 +79,8 @@ end t_darkᴾ = bgc.mean_residence_time_of_phytoplankton_in_unlit_mixed_layer.P t_darkᴰ = bgc.mean_residence_time_of_phytoplankton_in_unlit_mixed_layer.D - PARᴾ = P_PAR(PAR¹, PAR², PAR³, bgc) - PARᴰ = D_PAR(PAR¹, PAR², PAR³, bgc) + PARᴾ = P_PAR(PAR₁, PAR₂, PAR₃, bgc) + PARᴰ = D_PAR(PAR₁, PAR₂, PAR₃, bgc) μₙₒ₃ᴾ = uptake_rate_nitrate_P(P, PO₄, NO₃, NH₄, Pᶜʰˡ, Pᶠᵉ, T, zₘₓₗ, zₑᵤ, L_day, PARᴾ, t_darkᴾ, Si̅, bgc) μₙₒ₃ᴰ = uptake_rate_nitrate_D(D, PO₄, NO₃, NH₄, Si, Dᶜʰˡ, Dᶠᵉ, T, zₘₓₗ, zₑᵤ, L_day, PARᴰ, t_darkᴰ, Si̅, bgc) diff --git a/src/Models/AdvectedPopulations/PISCES/iron.jl b/src/Models/AdvectedPopulations/PISCES/iron.jl index e1181b8f4..2cfea5ebe 100644 --- a/src/Models/AdvectedPopulations/PISCES/iron.jl +++ b/src/Models/AdvectedPopulations/PISCES/iron.jl @@ -54,7 +54,7 @@ end return μₘₐₓ⁰*(bₚ^T)*Lₗᵢₘᵇᵃᶜᵗ*θₘₐₓᶠᵉᵇᵃᶜᵗ*Fe*Bact/(K_Feᴮ¹ + Fe + eps(0.0)) #eq63 end -@inline function (bgc::PISCES)(::Val{:Fe}, x, y, z, t, P, D, Z, M, Pᶜʰˡ, Dᶜʰˡ, Pᶠᵉ, Dᶠᵉ, Dˢⁱ, DOC, POC, GOC, SFe, BFe, PSi, NO₃, NH₄, PO₄, Fe, Si, CaCO₃, DIC, Alk, O₂, T, zₘₓₗ, zₑᵤ, Si̅, D_dust, Ω, PAR, PAR¹, PAR², PAR³) #eq60 +@inline function (bgc::PISCES)(::Val{:Fe}, x, y, z, t, P, D, Z, M, Pᶜʰˡ, Dᶜʰˡ, Pᶠᵉ, Dᶠᵉ, Dˢⁱ, DOC, POC, GOC, SFe, BFe, PSi, NO₃, NH₄, PO₄, Fe, Si, CaCO₃, DIC, Alk, O₂, T, zₘₓₗ, zₑᵤ, Si̅, D_dust, Ω, PAR, PAR₁, PAR₂, PAR₃) #eq60 #Parameters σᶻ, σᴹ = bgc.non_assimilated_fraction eₘₐₓᶻ, eₘₐₓᴹ = bgc.max_growth_efficiency_of_zooplankton diff --git a/src/Models/AdvectedPopulations/PISCES/iron_in_particles.jl b/src/Models/AdvectedPopulations/PISCES/iron_in_particles.jl index cdf54ade2..85413a21f 100644 --- a/src/Models/AdvectedPopulations/PISCES/iron_in_particles.jl +++ b/src/Models/AdvectedPopulations/PISCES/iron_in_particles.jl @@ -17,7 +17,7 @@ end #Scavenging of free form of dissolved iron. @inline Fe_scavenging(POC, GOC, CaCO₃, PSi, D_dust, DOC, T, Fe, bgc) = Fe_scavenging_rate(POC, GOC, CaCO₃, PSi, D_dust, bgc)*free_organic_iron(Fe, DOC, T) -@inline function (bgc::PISCES)(::Val{:SFe}, x, y, z, t, P, D, Z, M, Pᶜʰˡ, Dᶜʰˡ, Pᶠᵉ, Dᶠᵉ, Dˢⁱ, DOC, POC, GOC, SFe, BFe, PSi, NO₃, NH₄, PO₄, Fe, Si, CaCO₃, DIC, Alk, O₂, T, zₘₓₗ, zₑᵤ, Si̅, D_dust, Ω, PAR, PAR¹, PAR², PAR³) +@inline function (bgc::PISCES)(::Val{:SFe}, x, y, z, t, P, D, Z, M, Pᶜʰˡ, Dᶜʰˡ, Pᶠᵉ, Dᶠᵉ, Dˢⁱ, DOC, POC, GOC, SFe, BFe, PSi, NO₃, NH₄, PO₄, Fe, Si, CaCO₃, DIC, Alk, O₂, T, zₘₓₗ, zₑᵤ, Si̅, D_dust, Ω, PAR, PAR₁, PAR₂, PAR₃) #Parameters σᶻ = bgc.non_assimilated_fraction.Z rᶻ = bgc.zooplankton_linear_mortality.Z @@ -69,7 +69,7 @@ end end -@inline function (bgc::PISCES)(::Val{:BFe}, x, y, z, t, P, D, Z, M, Pᶜʰˡ, Dᶜʰˡ, Pᶠᵉ, Dᶠᵉ, Dˢⁱ, DOC, POC, GOC, SFe, BFe, PSi, NO₃, NH₄, PO₄, Fe, Si, CaCO₃, DIC, Alk, O₂, T, zₘₓₗ, zₑᵤ, Si̅, D_dust, Ω, PAR, PAR¹, PAR², PAR³) +@inline function (bgc::PISCES)(::Val{:BFe}, x, y, z, t, P, D, Z, M, Pᶜʰˡ, Dᶜʰˡ, Pᶠᵉ, Dᶠᵉ, Dˢⁱ, DOC, POC, GOC, SFe, BFe, PSi, NO₃, NH₄, PO₄, Fe, Si, CaCO₃, DIC, Alk, O₂, T, zₘₓₗ, zₑᵤ, Si̅, D_dust, Ω, PAR, PAR₁, PAR₂, PAR₃) #Parameters σᴹ = bgc.non_assimilated_fraction.M rᴹ = bgc.zooplankton_linear_mortality.M diff --git a/src/Models/AdvectedPopulations/PISCES/nitrates_ammonium.jl b/src/Models/AdvectedPopulations/PISCES/nitrates_ammonium.jl index 24f42ed94..c8e517c01 100644 --- a/src/Models/AdvectedPopulations/PISCES/nitrates_ammonium.jl +++ b/src/Models/AdvectedPopulations/PISCES/nitrates_ammonium.jl @@ -65,7 +65,7 @@ end @inline nitrification(NH₄, O₂, λₙₕ₄, PAR, bgc) = λₙₕ₄*NH₄*(1-oxygen_conditions(O₂, bgc))/(1+PAR) #eq56a #Forcing for NO₃ -@inline function (bgc::PISCES)(::Val{:NO₃}, x, y, z, t, P, D, Z, M, Pᶜʰˡ, Dᶜʰˡ, Pᶠᵉ, Dᶠᵉ, Dˢⁱ, DOC, POC, GOC, SFe, BFe, PSi, NO₃, NH₄, PO₄, Fe, Si, CaCO₃, DIC, Alk, O₂, T, zₘₓₗ, zₑᵤ, Si̅, D_dust, Ω, PAR, PAR¹, PAR², PAR³) +@inline function (bgc::PISCES)(::Val{:NO₃}, x, y, z, t, P, D, Z, M, Pᶜʰˡ, Dᶜʰˡ, Pᶠᵉ, Dᶠᵉ, Dˢⁱ, DOC, POC, GOC, SFe, BFe, PSi, NO₃, NH₄, PO₄, Fe, Si, CaCO₃, DIC, Alk, O₂, T, zₘₓₗ, zₑᵤ, Si̅, D_dust, Ω, PAR, PAR₁, PAR₂, PAR₃) #Parameters λₙₕ₄ = bgc.max_nitrification_rate θᴺᶜ = bgc.NC_redfield_ratio @@ -79,8 +79,8 @@ end L_day = day_length(ϕ, t, L_day_param) t_darkᴾ = bgc.mean_residence_time_of_phytoplankton_in_unlit_mixed_layer.P t_darkᴰ = bgc.mean_residence_time_of_phytoplankton_in_unlit_mixed_layer.D - PARᴾ = P_PAR(PAR¹, PAR², PAR³, bgc) - PARᴰ = D_PAR(PAR¹, PAR², PAR³, bgc) + PARᴾ = P_PAR(PAR₁, PAR₂, PAR₃, bgc) + PARᴰ = D_PAR(PAR₁, PAR₂, PAR₃, bgc) μₙₒ₃ᴾ = uptake_rate_nitrate_P(P, PO₄, NO₃, NH₄, Pᶜʰˡ, Pᶠᵉ, T, zₘₓₗ, zₑᵤ, L_day, PARᴾ, t_darkᴾ, Si̅, bgc) μₙₒ₃ᴰ = uptake_rate_nitrate_D(D, PO₄, NO₃, NH₄, Si, Dᶜʰˡ, Dᶠᵉ, T, zₘₓₗ, zₑᵤ, L_day, PARᴰ, t_darkᴰ, Si̅, bgc) @@ -117,7 +117,7 @@ end end #Forcing for NH₄, redfield conversion to model in molN/L. -@inline function (bgc::PISCES)(::Val{:NH₄}, x, y, z, t, P, D, Z, M, Pᶜʰˡ, Dᶜʰˡ, Pᶠᵉ, Dᶠᵉ, Dˢⁱ, DOC, POC, GOC, SFe, BFe, PSi, NO₃, NH₄, PO₄, Fe, Si, CaCO₃, DIC, Alk, O₂, T, zₘₓₗ, zₑᵤ, Si̅, D_dust, Ω, PAR, PAR¹, PAR², PAR³) +@inline function (bgc::PISCES)(::Val{:NH₄}, x, y, z, t, P, D, Z, M, Pᶜʰˡ, Dᶜʰˡ, Pᶠᵉ, Dᶠᵉ, Dˢⁱ, DOC, POC, GOC, SFe, BFe, PSi, NO₃, NH₄, PO₄, Fe, Si, CaCO₃, DIC, Alk, O₂, T, zₘₓₗ, zₑᵤ, Si̅, D_dust, Ω, PAR, PAR₁, PAR₂, PAR₃) #Parameters γᶻ = bgc.excretion_as_DOM.Z σᶻ = bgc.non_assimilated_fraction.Z @@ -138,8 +138,8 @@ end t_darkᴾ = bgc.mean_residence_time_of_phytoplankton_in_unlit_mixed_layer.P t_darkᴰ = bgc.mean_residence_time_of_phytoplankton_in_unlit_mixed_layer.D - PARᴾ = P_PAR(PAR¹, PAR², PAR³, bgc) - PARᴰ = D_PAR(PAR¹, PAR², PAR³, bgc) + PARᴾ = P_PAR(PAR₁, PAR₂, PAR₃, bgc) + PARᴰ = D_PAR(PAR₁, PAR₂, PAR₃, bgc) μₙₕ₄ᴾ = uptake_rate_ammonium_P(P, PO₄, NO₃, NH₄, Pᶜʰˡ, Pᶠᵉ, T, zₘₓₗ, zₑᵤ, L_day, PARᴾ, t_darkᴾ, Si̅, bgc) μₙₕ₄ᴰ = uptake_rate_ammonium_D(D, PO₄, NO₃, NH₄, Si, Dᶜʰˡ, Dᶠᵉ, T, zₘₓₗ, zₑᵤ, L_day, PARᴰ, t_darkᴰ, Si̅, bgc) diff --git a/src/Models/AdvectedPopulations/PISCES/oxygen.jl b/src/Models/AdvectedPopulations/PISCES/oxygen.jl index c22ea186b..272b50c2c 100644 --- a/src/Models/AdvectedPopulations/PISCES/oxygen.jl +++ b/src/Models/AdvectedPopulations/PISCES/oxygen.jl @@ -1,7 +1,7 @@ #This document contains functions for: #O₂ forcing (eq83) -@inline function (bgc::PISCES)(::Val{:O₂}, x, y, z, t, P, D, Z, M, Pᶜʰˡ, Dᶜʰˡ, Pᶠᵉ, Dᶠᵉ, Dˢⁱ, DOC, POC, GOC, SFe, BFe, PSi, NO₃, NH₄, PO₄, Fe, Si, CaCO₃, DIC, Alk, O₂, T, zₘₓₗ, zₑᵤ, Si̅, D_dust, Ω, PAR, PAR¹, PAR², PAR³) +@inline function (bgc::PISCES)(::Val{:O₂}, x, y, z, t, P, D, Z, M, Pᶜʰˡ, Dᶜʰˡ, Pᶠᵉ, Dᶠᵉ, Dˢⁱ, DOC, POC, GOC, SFe, BFe, PSi, NO₃, NH₄, PO₄, Fe, Si, CaCO₃, DIC, Alk, O₂, T, zₘₓₗ, zₑᵤ, Si̅, D_dust, Ω, PAR, PAR₁, PAR₂, PAR₃) O₂ᵘᵗ = bgc.OC_for_ammonium_based_processes O₂ⁿⁱᵗ = bgc.OC_ratio_of_nitrification @@ -20,8 +20,8 @@ t_darkᴾ = bgc.mean_residence_time_of_phytoplankton_in_unlit_mixed_layer.P t_darkᴰ = bgc.mean_residence_time_of_phytoplankton_in_unlit_mixed_layer.D - PARᴾ = P_PAR(PAR¹, PAR², PAR³, bgc) - PARᴰ = D_PAR(PAR¹, PAR², PAR³, bgc) + PARᴾ = P_PAR(PAR₁, PAR₂, PAR₃, bgc) + PARᴰ = D_PAR(PAR₁, PAR₂, PAR₃, bgc) eₘₐₓᶻ = bgc.max_growth_efficiency_of_zooplankton.Z eₘₐₓᴹ = bgc.max_growth_efficiency_of_zooplankton.M #Grazing diff --git a/src/Models/AdvectedPopulations/PISCES/phosphates.jl b/src/Models/AdvectedPopulations/PISCES/phosphates.jl index d490af2fb..15012010e 100644 --- a/src/Models/AdvectedPopulations/PISCES/phosphates.jl +++ b/src/Models/AdvectedPopulations/PISCES/phosphates.jl @@ -1,7 +1,7 @@ #This document contains functions for: #PO₄ forcing (eq59), multiplied by redfield ratio to return in μmolP/L -@inline function (bgc::PISCES)(::Val{:PO₄}, x, y, z, t, P, D, Z, M, Pᶜʰˡ, Dᶜʰˡ, Pᶠᵉ, Dᶠᵉ, Dˢⁱ, DOC, POC, GOC, SFe, BFe, PSi, NO₃, NH₄, PO₄, Fe, Si, CaCO₃, DIC, Alk, O₂, T, zₘₓₗ, zₑᵤ, Si̅, D_dust, Ω, PAR, PAR¹, PAR², PAR³) +@inline function (bgc::PISCES)(::Val{:PO₄}, x, y, z, t, P, D, Z, M, Pᶜʰˡ, Dᶜʰˡ, Pᶠᵉ, Dᶠᵉ, Dˢⁱ, DOC, POC, GOC, SFe, BFe, PSi, NO₃, NH₄, PO₄, Fe, Si, CaCO₃, DIC, Alk, O₂, T, zₘₓₗ, zₑᵤ, Si̅, D_dust, Ω, PAR, PAR₁, PAR₂, PAR₃) #Parameters γᶻ = bgc.excretion_as_DOM.Z σᶻ = bgc.non_assimilated_fraction.Z @@ -35,8 +35,8 @@ L_day = day_length(ϕ, t, L_day_param) t_darkᴾ = bgc.mean_residence_time_of_phytoplankton_in_unlit_mixed_layer.P t_darkᴰ = bgc.mean_residence_time_of_phytoplankton_in_unlit_mixed_layer.D - PARᴾ = P_PAR(PAR¹, PAR², PAR³, bgc) - PARᴰ = D_PAR(PAR¹, PAR², PAR³, bgc) + PARᴾ = P_PAR(PAR₁, PAR₂, PAR₃, bgc) + PARᴰ = D_PAR(PAR₁, PAR₂, PAR₃, bgc) Lₗᵢₘᴾ = P_nutrient_limitation(P, PO₄, NO₃, NH₄, Pᶜʰˡ, Pᶠᵉ, bgc)[1] Lₗᵢₘᴰ = D_nutrient_limitation(D, PO₄, NO₃, NH₄, Si, Dᶜʰˡ, Dᶠᵉ, Si̅, bgc)[1] diff --git a/src/Models/AdvectedPopulations/PISCES/phytoplankton.jl b/src/Models/AdvectedPopulations/PISCES/phytoplankton.jl index f25be7ef9..e065f6e54 100644 --- a/src/Models/AdvectedPopulations/PISCES/phytoplankton.jl +++ b/src/Models/AdvectedPopulations/PISCES/phytoplankton.jl @@ -52,20 +52,20 @@ end @inline nutrient_half_saturation_const(Kᵢᴶᵐⁱⁿ, J₁, J₂, Sᵣₐₜᴶ) = Kᵢᴶᵐⁱⁿ* (J₁ + Sᵣₐₜᴶ* J₂)/(J₁ + J₂ + eps(0.0)) #eq 7c #Light absorption by phytoplankton. Visible light split into 3 wavebands, where light absorption of each waveband controlled by coefficient. -@inline function P_PAR(PAR¹, PAR², PAR³, bgc) +@inline function P_PAR(PAR₁, PAR₂, PAR₃, bgc) β₁ᴾ = bgc.absorption_in_the_blue_part_of_light.P β₂ᴾ = bgc.absorption_in_the_green_part_of_light.P β₃ᴾ = bgc.absorption_in_the_red_part_of_light.P - return β₁ᴾ*PAR¹ + β₂ᴾ*PAR² + β₃ᴾ*PAR³ + return β₁ᴾ*PAR₁ + β₂ᴾ*PAR₂ + β₃ᴾ*PAR₃ end -@inline function D_PAR(PAR¹, PAR², PAR³, bgc) +@inline function D_PAR(PAR₁, PAR₂, PAR₃, bgc) β₁ᴰ = bgc.absorption_in_the_blue_part_of_light.D β₂ᴰ = bgc.absorption_in_the_green_part_of_light.D β₃ᴰ = bgc.absorption_in_the_red_part_of_light.D - return β₁ᴰ*PAR¹ + β₂ᴰ*PAR² + β₃ᴰ*PAR³ + return β₁ᴰ*PAR₁ + β₂ᴰ*PAR₂ + β₃ᴰ*PAR₃ end #The growth rate of the iron biomass of phytoplankton. @@ -194,7 +194,7 @@ end end #Phytoplankton forcing -@inline function (bgc::PISCES)(::Val{:P}, x, y, z, t, P, D, Z, M, Pᶜʰˡ, Dᶜʰˡ, Pᶠᵉ, Dᶠᵉ, Dˢⁱ, DOC, POC, GOC, SFe, BFe, PSi, NO₃, NH₄, PO₄, Fe, Si, CaCO₃, DIC, Alk, O₂, T, zₘₓₗ, zₑᵤ, Si̅, D_dust, Ω, PAR, PAR¹, PAR², PAR³) +@inline function (bgc::PISCES)(::Val{:P}, x, y, z, t, P, D, Z, M, Pᶜʰˡ, Dᶜʰˡ, Pᶠᵉ, Dᶠᵉ, Dˢⁱ, DOC, POC, GOC, SFe, BFe, PSi, NO₃, NH₄, PO₄, Fe, Si, CaCO₃, DIC, Alk, O₂, T, zₘₓₗ, zₑᵤ, Si̅, D_dust, Ω, PAR, PAR₁, PAR₂, PAR₃) #Parameters δᴾ = bgc.exudation_of_DOC.P mᴾ = bgc.phytoplankton_mortality_rate.P @@ -217,14 +217,14 @@ end #Phytoplankton growth Lₗᵢₘᴾ = P_nutrient_limitation(P, PO₄, NO₃, NH₄, Pᶜʰˡ, Pᶠᵉ, bgc)[1] t_darkᴾ = bgc.mean_residence_time_of_phytoplankton_in_unlit_mixed_layer.P - PARᴾ = P_PAR(PAR¹, PAR², PAR³, bgc) + PARᴾ = P_PAR(PAR₁, PAR₂, PAR₃, bgc) μᴾ = phytoplankton_growth_rate(P, Pᶜʰˡ, PARᴾ, L_day, T, αᴾ, Lₗᵢₘᴾ, zₘₓₗ, zₑᵤ, t_darkᴾ, bgc) return (1-δᴾ)*μᴾ*P - mᴾ*concentration_limitation(P, Kₘ)*P - sh*wᴾ*P^2 - gₚᶻ*Z - gₚᴹ*M #eq 1 end #Diatom forcing -@inline function (bgc::PISCES)(::Val{:D}, x, y, z, t, P, D, Z, M, Pᶜʰˡ, Dᶜʰˡ, Pᶠᵉ, Dᶠᵉ, Dˢⁱ, DOC, POC, GOC, SFe, BFe, PSi, NO₃, NH₄, PO₄, Fe, Si, CaCO₃, DIC, Alk, O₂, T, zₘₓₗ, zₑᵤ, Si̅, D_dust, Ω, PAR, PAR¹, PAR², PAR³) +@inline function (bgc::PISCES)(::Val{:D}, x, y, z, t, P, D, Z, M, Pᶜʰˡ, Dᶜʰˡ, Pᶠᵉ, Dᶠᵉ, Dˢⁱ, DOC, POC, GOC, SFe, BFe, PSi, NO₃, NH₄, PO₄, Fe, Si, CaCO₃, DIC, Alk, O₂, T, zₘₓₗ, zₑᵤ, Si̅, D_dust, Ω, PAR, PAR₁, PAR₂, PAR₃) #Parameters δᴰ = bgc.exudation_of_DOC.D mᴰ = bgc.phytoplankton_mortality_rate.D @@ -247,7 +247,7 @@ end Lₗᵢₘᴰ = D_nutrient_limitation(D, PO₄, NO₃, NH₄, Si, Dᶜʰˡ, Dᶠᵉ, Si̅, bgc)[1] #Also required - PARᴰ = D_PAR(PAR¹, PAR², PAR³, bgc) + PARᴰ = D_PAR(PAR₁, PAR₂, PAR₃, bgc) t_darkᴰ = bgc.mean_residence_time_of_phytoplankton_in_unlit_mixed_layer.D μᴰ = phytoplankton_growth_rate(D, Dᶜʰˡ, PARᴰ, L_day, T, αᴰ, Lₗᵢₘᴰ, zₘₓₗ, zₑᵤ, t_darkᴰ, bgc) wᴰ = D_quadratic_mortality(D, PO₄, NO₃, NH₄, Si, Dᶜʰˡ, Dᶠᵉ, Si̅, bgc) #13 @@ -256,7 +256,7 @@ end end #Forcing for chlorophyll biomass of nanophytoplankton -@inline function (bgc::PISCES)(::Val{:Pᶜʰˡ}, x, y, z, t, P, D, Z, M, Pᶜʰˡ, Dᶜʰˡ, Pᶠᵉ, Dᶠᵉ, Dˢⁱ, DOC, POC, GOC, SFe, BFe, PSi, NO₃, NH₄, PO₄, Fe, Si, CaCO₃, DIC, Alk, O₂, T, zₘₓₗ, zₑᵤ, Si̅, D_dust, Ω, PAR, PAR¹, PAR², PAR³) +@inline function (bgc::PISCES)(::Val{:Pᶜʰˡ}, x, y, z, t, P, D, Z, M, Pᶜʰˡ, Dᶜʰˡ, Pᶠᵉ, Dᶠᵉ, Dˢⁱ, DOC, POC, GOC, SFe, BFe, PSi, NO₃, NH₄, PO₄, Fe, Si, CaCO₃, DIC, Alk, O₂, T, zₘₓₗ, zₑᵤ, Si̅, D_dust, Ω, PAR, PAR₁, PAR₂, PAR₃) #Parameters δᴾ = bgc.exudation_of_DOC.P αᴾ = bgc.initial_slope_of_PI_curve.P @@ -281,7 +281,7 @@ end #Phytoplankton growth t_darkᴾ = bgc.mean_residence_time_of_phytoplankton_in_unlit_mixed_layer.P Lₗᵢₘᴾ= P_nutrient_limitation(P, PO₄, NO₃, NH₄, Pᶜʰˡ, Pᶠᵉ, bgc)[1] - PARᴾ = P_PAR(PAR¹, PAR², PAR³, bgc) + PARᴾ = P_PAR(PAR₁, PAR₂, PAR₃, bgc) μᴾ = phytoplankton_growth_rate(P, Pᶜʰˡ, PARᴾ, L_day, T, αᴾ, Lₗᵢₘᴾ, zₘₓₗ, zₑᵤ, t_darkᴾ, bgc) μ̌ᴾ = μᴾ / day_dependent_growth_rate(L_day) #15b @@ -292,7 +292,7 @@ end end #Forcing for chlorophyll biomass of diatoms -@inline function (bgc::PISCES)(::Val{:Dᶜʰˡ}, x, y, z, t, P, D, Z, M, Pᶜʰˡ, Dᶜʰˡ, Pᶠᵉ, Dᶠᵉ, Dˢⁱ, DOC, POC, GOC, SFe, BFe, PSi, NO₃, NH₄, PO₄, Fe, Si, CaCO₃, DIC, Alk, O₂, T, zₘₓₗ, zₑᵤ, Si̅, D_dust, Ω, PAR, PAR¹, PAR², PAR³) +@inline function (bgc::PISCES)(::Val{:Dᶜʰˡ}, x, y, z, t, P, D, Z, M, Pᶜʰˡ, Dᶜʰˡ, Pᶠᵉ, Dᶠᵉ, Dˢⁱ, DOC, POC, GOC, SFe, BFe, PSi, NO₃, NH₄, PO₄, Fe, Si, CaCO₃, DIC, Alk, O₂, T, zₘₓₗ, zₑᵤ, Si̅, D_dust, Ω, PAR, PAR₁, PAR₂, PAR₃) #Parameters δᴰ = bgc.exudation_of_DOC.D αᴰ = bgc.initial_slope_of_PI_curve.D @@ -317,7 +317,7 @@ end #Diatom growth Lₗᵢₘᴰ = D_nutrient_limitation(D, PO₄, NO₃, NH₄, Si, Dᶜʰˡ, Dᶠᵉ, Si̅, bgc)[1] - PARᴰ = D_PAR(PAR¹, PAR², PAR³, bgc) + PARᴰ = D_PAR(PAR₁, PAR₂, PAR₃, bgc) t_darkᴰ = bgc.mean_residence_time_of_phytoplankton_in_unlit_mixed_layer.D μᴰ = phytoplankton_growth_rate(D, Dᶜʰˡ, PARᴰ, L_day, T, αᴰ, Lₗᵢₘᴰ, zₘₓₗ, zₑᵤ, t_darkᴰ, bgc) @@ -332,7 +332,7 @@ end end #Forcing for iron biomass of nanophytoplankton -@inline function (bgc::PISCES)(::Val{:Pᶠᵉ}, x, y, z, t, P, D, Z, M, Pᶜʰˡ, Dᶜʰˡ, Pᶠᵉ, Dᶠᵉ, Dˢⁱ, DOC, POC, GOC, SFe, BFe, PSi, NO₃, NH₄, PO₄, Fe, Si, CaCO₃, DIC, Alk, O₂, T, zₘₓₗ, zₑᵤ, Si̅, D_dust, Ω, PAR, PAR¹, PAR², PAR³) +@inline function (bgc::PISCES)(::Val{:Pᶠᵉ}, x, y, z, t, P, D, Z, M, Pᶜʰˡ, Dᶜʰˡ, Pᶠᵉ, Dᶠᵉ, Dˢⁱ, DOC, POC, GOC, SFe, BFe, PSi, NO₃, NH₄, PO₄, Fe, Si, CaCO₃, DIC, Alk, O₂, T, zₘₓₗ, zₑᵤ, Si̅, D_dust, Ω, PAR, PAR₁, PAR₂, PAR₃) #Parameters δᴾ = bgc.exudation_of_DOC.P θₘₐₓᶠᵉᵖ = bgc.max_iron_quota.P @@ -359,7 +359,7 @@ end end #Forcing for chlorophyll biomass of diatoms -@inline function (bgc::PISCES)(::Val{:Dᶠᵉ}, x, y, z, t, P, D, Z, M, Pᶜʰˡ, Dᶜʰˡ, Pᶠᵉ, Dᶠᵉ, Dˢⁱ, DOC, POC, GOC, SFe, BFe, PSi, NO₃, NH₄, PO₄, Fe, Si, CaCO₃, DIC, Alk, O₂, T, zₘₓₗ, zₑᵤ, Si̅, D_dust, Ω, PAR, PAR¹, PAR², PAR³) +@inline function (bgc::PISCES)(::Val{:Dᶠᵉ}, x, y, z, t, P, D, Z, M, Pᶜʰˡ, Dᶜʰˡ, Pᶠᵉ, Dᶠᵉ, Dˢⁱ, DOC, POC, GOC, SFe, BFe, PSi, NO₃, NH₄, PO₄, Fe, Si, CaCO₃, DIC, Alk, O₂, T, zₘₓₗ, zₑᵤ, Si̅, D_dust, Ω, PAR, PAR₁, PAR₂, PAR₃) #Parameters δᴰ = bgc.exudation_of_DOC.D θₘₐₓᶠᵉᴰ = bgc.max_iron_quota.D @@ -391,7 +391,7 @@ end end #Forcing equations for silicon biomass of diatoms -@inline function (bgc::PISCES)(::Val{:Dˢⁱ}, x, y, z, t, P, D, Z, M, Pᶜʰˡ, Dᶜʰˡ, Pᶠᵉ, Dᶠᵉ, Dˢⁱ, DOC, POC, GOC, SFe, BFe, PSi, NO₃, NH₄, PO₄, Fe, Si, CaCO₃, DIC, Alk, O₂, T, zₘₓₗ, zₑᵤ, Si̅, D_dust, Ω, PAR, PAR¹, PAR², PAR³) #ϕ is latitude +@inline function (bgc::PISCES)(::Val{:Dˢⁱ}, x, y, z, t, P, D, Z, M, Pᶜʰˡ, Dᶜʰˡ, Pᶠᵉ, Dᶠᵉ, Dˢⁱ, DOC, POC, GOC, SFe, BFe, PSi, NO₃, NH₄, PO₄, Fe, Si, CaCO₃, DIC, Alk, O₂, T, zₘₓₗ, zₑᵤ, Si̅, D_dust, Ω, PAR, PAR₁, PAR₂, PAR₃) #ϕ is latitude #Parameters δᴰ = bgc.exudation_of_DOC.D mᴰ = bgc.phytoplankton_mortality_rate.D @@ -412,7 +412,7 @@ end #Diatom growth Lₗᵢₘᴰ = D_nutrient_limitation(D, PO₄, NO₃, NH₄, Si, Dᶜʰˡ, Dᶠᵉ, Si̅, bgc)[1] - PARᴰ = D_PAR(PAR¹, PAR², PAR³, bgc) + PARᴰ = D_PAR(PAR₁, PAR₂, PAR₃, bgc) μᴰ = phytoplankton_growth_rate(D, Dᶜʰˡ, PARᴰ, L_day, T, αᴰ, Lₗᵢₘᴰ, zₘₓₗ, zₑᵤ, t_darkᴰ, bgc) #Also required diff --git a/src/Models/AdvectedPopulations/PISCES/psi.jl b/src/Models/AdvectedPopulations/PISCES/psi.jl index 216228e95..7a0fa71e2 100644 --- a/src/Models/AdvectedPopulations/PISCES/psi.jl +++ b/src/Models/AdvectedPopulations/PISCES/psi.jl @@ -28,7 +28,7 @@ end end #Forcing for PSi -@inline function (bgc::PISCES)(::Val{:PSi}, x, y, z, t, P, D, Z, M, Pᶜʰˡ, Dᶜʰˡ, Pᶠᵉ, Dᶠᵉ, Dˢⁱ, DOC, POC, GOC, SFe, BFe, PSi, NO₃, NH₄, PO₄, Fe, Si, CaCO₃, DIC, Alk, O₂, T, zₘₓₗ, zₑᵤ, Si̅, D_dust, Ω, PAR, PAR¹, PAR², PAR³) +@inline function (bgc::PISCES)(::Val{:PSi}, x, y, z, t, P, D, Z, M, Pᶜʰˡ, Dᶜʰˡ, Pᶠᵉ, Dᶠᵉ, Dˢⁱ, DOC, POC, GOC, SFe, BFe, PSi, NO₃, NH₄, PO₄, Fe, Si, CaCO₃, DIC, Alk, O₂, T, zₘₓₗ, zₑᵤ, Si̅, D_dust, Ω, PAR, PAR₁, PAR₂, PAR₃) #Parameters Kₘ = bgc.half_saturation_const_for_mortality Dissₛᵢ = bgc.dissolution_rate_of_silicon diff --git a/src/Models/AdvectedPopulations/PISCES/si.jl b/src/Models/AdvectedPopulations/PISCES/si.jl index 27d604d6f..958c11446 100644 --- a/src/Models/AdvectedPopulations/PISCES/si.jl +++ b/src/Models/AdvectedPopulations/PISCES/si.jl @@ -4,7 +4,7 @@ # This documentation contains functions for: #Si (eq74) -@inline function (bgc::PISCES)(::Val{:Si}, x, y, z, t, P, D, Z, M, Pᶜʰˡ, Dᶜʰˡ, Pᶠᵉ, Dᶠᵉ, Dˢⁱ, DOC, POC, GOC, SFe, BFe, PSi, NO₃, NH₄, PO₄, Fe, Si, CaCO₃, DIC, Alk, O₂, T, zₘₓₗ, zₑᵤ, Si̅, D_dust, Ω, PAR, PAR¹, PAR², PAR³) #eq74 +@inline function (bgc::PISCES)(::Val{:Si}, x, y, z, t, P, D, Z, M, Pᶜʰˡ, Dᶜʰˡ, Pᶠᵉ, Dᶠᵉ, Dˢⁱ, DOC, POC, GOC, SFe, BFe, PSi, NO₃, NH₄, PO₄, Fe, Si, CaCO₃, DIC, Alk, O₂, T, zₘₓₗ, zₑᵤ, Si̅, D_dust, Ω, PAR, PAR₁, PAR₂, PAR₃) #eq74 #Parameters δᴰ = bgc.exudation_of_DOC.D αᴰ = bgc.initial_slope_of_PI_curve.D @@ -21,7 +21,7 @@ #Diatom growth Lₗᵢₘᴰ = D_nutrient_limitation(D, PO₄, NO₃, NH₄, Si, Dᶜʰˡ, Dᶠᵉ, Si̅, bgc)[1] - PARᴰ = D_PAR(PAR¹, PAR², PAR³, bgc) + PARᴰ = D_PAR(PAR₁, PAR₂, PAR₃, bgc) μᴰ = phytoplankton_growth_rate(D, Dᶜʰˡ, PARᴰ, L_day, T, αᴰ, Lₗᵢₘᴰ, zₘₓₗ, zₑᵤ, t_darkᴰ, bgc) return λₚₛᵢ¹*Dissₛᵢ*PSi - variation_in_SiC_ratio(D, PO₄, NO₃, NH₄, Si, Dᶜʰˡ, Dᶠᵉ, μᴰ, T, ϕ, Si̅, bgc)*(1-δᴰ)*μᴰ*D #eq74 diff --git a/src/Models/AdvectedPopulations/PISCES/zooplankton.jl b/src/Models/AdvectedPopulations/PISCES/zooplankton.jl index 20b9727a2..53d4c22a3 100644 --- a/src/Models/AdvectedPopulations/PISCES/zooplankton.jl +++ b/src/Models/AdvectedPopulations/PISCES/zooplankton.jl @@ -123,7 +123,7 @@ end end -@inline function (bgc::PISCES)(::Val{:Z}, x, y, z, t, P, D, Z, M, Pᶜʰˡ, Dᶜʰˡ, Pᶠᵉ, Dᶠᵉ, Dˢⁱ, DOC, POC, GOC, SFe, BFe, PSi, NO₃, NH₄, PO₄, Fe, Si, CaCO₃, DIC, Alk, O₂, T, zₘₓₗ, zₑᵤ, Si̅, D_dust, Ω, PAR, PAR¹, PAR², PAR³) #args not correct +@inline function (bgc::PISCES)(::Val{:Z}, x, y, z, t, P, D, Z, M, Pᶜʰˡ, Dᶜʰˡ, Pᶠᵉ, Dᶠᵉ, Dˢⁱ, DOC, POC, GOC, SFe, BFe, PSi, NO₃, NH₄, PO₄, Fe, Si, CaCO₃, DIC, Alk, O₂, T, zₘₓₗ, zₑᵤ, Si̅, D_dust, Ω, PAR, PAR₁, PAR₂, PAR₃) #args not correct #Parameters mᶻ = bgc.zooplankton_quadratic_mortality.Z b_Z = bgc.temperature_sensitivity_term.Z @@ -143,7 +143,7 @@ end - rᶻ*(b_Z^T)*(concentration_limitation(Z, Kₘ) + 3*oxygen_conditions(O₂, bgc))*Z) #24 end -@inline function (bgc::PISCES)(::Val{:M}, x, y, z, t, P, D, Z, M, Pᶜʰˡ, Dᶜʰˡ, Pᶠᵉ, Dᶠᵉ, Dˢⁱ, DOC, POC, GOC, SFe, BFe, PSi, NO₃, NH₄, PO₄, Fe, Si, CaCO₃, DIC, Alk, O₂, T, zₘₓₗ, zₑᵤ, Si̅, D_dust, Ω, PAR, PAR¹, PAR², PAR³) +@inline function (bgc::PISCES)(::Val{:M}, x, y, z, t, P, D, Z, M, Pᶜʰˡ, Dᶜʰˡ, Pᶠᵉ, Dᶠᵉ, Dˢⁱ, DOC, POC, GOC, SFe, BFe, PSi, NO₃, NH₄, PO₄, Fe, Si, CaCO₃, DIC, Alk, O₂, T, zₘₓₗ, zₑᵤ, Si̅, D_dust, Ω, PAR, PAR₁, PAR₂, PAR₃) #Parameters mᴹ = bgc.zooplankton_quadratic_mortality.M bₘ = bgc.temperature_sensitivity_term.M diff --git a/validation/PISCES/columnPISCES.jl b/validation/PISCES/columnPISCES.jl index 821b03cfa..892de60c3 100644 --- a/validation/PISCES/columnPISCES.jl +++ b/validation/PISCES/columnPISCES.jl @@ -14,7 +14,6 @@ # ## Model setup # We load the packages and choose the default LOBSTER parameter set using OceanBioME, Oceananigans, Printf -using OceanBioME.SLatissimaModel: SLatissima using Oceananigans.Fields: FunctionField, ConstantField using Oceananigans.Units @@ -24,7 +23,7 @@ nothing #hide # ## Surface PAR and turbulent vertical diffusivity based on idealised mixed layer depth # Setting up idealised functions for PAR and diffusivity (details here can be ignored but these are typical of the North Atlantic) -@inline PAR⁰(x, y, t) = 60 * (1 - cos((t + 15days) * 2π / year)) * (1 / (1 + 0.2 * exp(-((mod(t, year) - 200days) / 50days)^2))) + 2 +@inline PAR⁰(t) = 60 * (1 - cos((t + 15days) * 2π / year)) * (1 / (1 + 0.2 * exp(-((mod(t, year) - 200days) / 50days)^2))) + 2 @inline H(t, t₀, t₁) = ifelse(t₀ < t < t₁, 1.0, 0.0) @@ -73,10 +72,10 @@ PAR³ = FunctionField{Center, Center, Center}(PAR_func3, grid; clock) # and then setup the Oceananigans model with the boundary condition for the DIC based on the air-sea CO₂ flux. biogeochemistry = PISCES(; grid, - light_attenuation_model = PrescribedPhotosyntheticallyActiveRadiation((; PAR, PAR¹, PAR², PAR³)), sinking_speeds = (; POC = w_POC, SFe = w_POC, GOC = w_GOC, BFe = w_GOC, PSi = w_GOC, CaCO₃ = w_GOC) -) + light_attenuation_model = MultiBandPhotosyntheticallyActiveRadiation(; grid, surface_PAR = PAR⁰), + sinking_speeds = (; POC = w_POC, SFe = w_POC, GOC = w_GOC, BFe = w_GOC, PSi = w_GOC, CaCO₃ = w_GOC)) -CO₂_flux = GasExchange(; gas = :CO₂) +CO₂_flux = CarbonDioxideGasExchangeBoundaryCondition() funT = FunctionField{Center, Center, Center}(temp, grid; clock) S = ConstantField(35) @@ -86,9 +85,8 @@ model = NonhydrostaticModel(; grid, clock, closure = ScalarDiffusivity(ν = κₜ, κ = κₜ), biogeochemistry, - boundary_conditions = (DIC = FieldBoundaryConditions(top = CO₂_flux), ), - auxiliary_fields = (; S, zₘₓₗ = mixed_layer_depth, zₑᵤ = euphotic_layer_depth, Si̅ = yearly_maximum_silicate, D_dust = dust_deposition, Ω = carbonate_sat_ratio, PAR, PAR¹, PAR², PAR³ ) - ) + boundary_conditions = (DIC = FieldBoundaryConditions(top = CO₂_flux), )) + @info "Setting initial values..." set!(model, NO₃ = 4.0, NH₄ = 0.1, P = 4.26, D = 4.26, Z = .426, M = .426, Pᶠᵉ = 7e-6 * 1e9 / 1e6 * 4.26, Dᶠᵉ = 7e-6 * 1e9 / 1e6 * 4.26, Pᶜʰˡ = 1.0, Dᶜʰˡ = 1.0, Dˢⁱ = 0.67734, SFe = 7e-6 * 1e9 / 1e6 * 0.8, BFe = 7e-6 * 1e9 / 1e6 * 0.8, Fe = 0.8, O₂ = 264.0, Si = 4.557, Alk = 2360.0, PO₄ = 1.8114, DIC = 2000.0, CaCO₃ = 0.0001, T = funT) From 705161471ef629525be01b5362912a7b33d52a31 Mon Sep 17 00:00:00 2001 From: Jago Strong-Wright Date: Fri, 23 Aug 2024 17:57:21 +0100 Subject: [PATCH 3/3] made column script run again --- src/Models/AdvectedPopulations/PISCES/PISCES.jl | 2 +- validation/PISCES/boxPISCES.jl | 8 ++++---- validation/PISCES/columnPISCES.jl | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Models/AdvectedPopulations/PISCES/PISCES.jl b/src/Models/AdvectedPopulations/PISCES/PISCES.jl index 58edecdc0..588470f41 100644 --- a/src/Models/AdvectedPopulations/PISCES/PISCES.jl +++ b/src/Models/AdvectedPopulations/PISCES/PISCES.jl @@ -913,7 +913,7 @@ adapt_structure(to, pisces::PISCES) = # you can updatye these if you want it to have a pretty way of showing uyou its a pisces model summary(::PISCES{FT}) where {FT} = string("PISCES{$FT}") -show(io::IO, model::PISCES) where {FT, B, W, PD, ZM, OT} = print(io, string("Pelagic Interactions Scheme for Carbon and Ecosystem Studies (PISCES) model")) # maybe add some more info here +show(io::IO, model::PISCES) = print(io, string("Pelagic Interactions Scheme for Carbon and Ecosystem Studies (PISCES) model")) # maybe add some more info here @inline maximum_sinking_velocity(bgc::PISCES) = maximum(abs, bgc.sinking_velocities.bPOM.w) # might need ot update this for wghatever the fastest sinking pareticles are diff --git a/validation/PISCES/boxPISCES.jl b/validation/PISCES/boxPISCES.jl index 6ec20e866..3b12bc8fc 100644 --- a/validation/PISCES/boxPISCES.jl +++ b/validation/PISCES/boxPISCES.jl @@ -33,14 +33,14 @@ PAR_func2(t) = PAR_func(t)/3 PAR_func3(t)= PAR_func(t)/3 PAR = FunctionField{Center, Center, Center}(PAR_func, grid; clock) -PAR¹ = FunctionField{Center, Center, Center}(PAR_func1, grid; clock) -PAR² = FunctionField{Center, Center, Center}(PAR_func2, grid; clock) -PAR³ = FunctionField{Center, Center, Center}(PAR_func3, grid; clock) +PAR₁ = FunctionField{Center, Center, Center}(PAR_func1, grid; clock) +PAR₂ = FunctionField{Center, Center, Center}(PAR_func2, grid; clock) +PAR₃ = FunctionField{Center, Center, Center}(PAR_func3, grid; clock) nothing #hide # Set up the model. Here, first specify the biogeochemical model, followed by initial conditions and the start and end times -model = BoxModel(; biogeochemistry = PISCES(; grid, light_attenuation_model = PrescribedPhotosyntheticallyActiveRadiation((; PAR, PAR¹, PAR², PAR³)), flux_feeding_rate = 2.0e-3), +model = BoxModel(; biogeochemistry = PISCES(; grid, light_attenuation_model = PrescribedPhotosyntheticallyActiveRadiation((; PAR, PAR₁, PAR₂, PAR₃)), flux_feeding_rate = 2.0e-3), clock) set!(model, NO₃ = 4.0, NH₄ = 0.1, P = 4.26, D = 4.26, Z = .426, M = .426, Pᶠᵉ = 7e-6 * 1e9 / 1e6 * 4.26, Dᶠᵉ = 7e-6 * 1e9 / 1e6 * 4.26, Pᶜʰˡ = 1.0, Dᶜʰˡ = 1.0, Dˢⁱ = 0.67734, SFe = 7e-6 * 1e9 / 1e6 * 0.8, BFe = 7e-6 * 1e9 / 1e6 * 0.8, Fe = 0.8, O₂ = 264.0, Si = 4.557, Alk = 2360.0, PO₄ = 1.8114, DIC = 2000.0, CaCO₃ = 0.0001, T = 14.0) diff --git a/validation/PISCES/columnPISCES.jl b/validation/PISCES/columnPISCES.jl index 892de60c3..46f1c58a9 100644 --- a/validation/PISCES/columnPISCES.jl +++ b/validation/PISCES/columnPISCES.jl @@ -57,9 +57,9 @@ grid = RectilinearGrid(size = (1, 1, 50), extent = (20meters, 20meters, 200meter clock = Clock(; time = 0.0) PAR = FunctionField{Center, Center, Center}(PAR_func, grid; clock) -PAR¹ = FunctionField{Center, Center, Center}(PAR_func1, grid; clock) -PAR² = FunctionField{Center, Center, Center}(PAR_func2, grid; clock) -PAR³ = FunctionField{Center, Center, Center}(PAR_func3, grid; clock) +PAR₁ = FunctionField{Center, Center, Center}(PAR_func1, grid; clock) +PAR₂ = FunctionField{Center, Center, Center}(PAR_func2, grid; clock) +PAR₃ = FunctionField{Center, Center, Center}(PAR_func3, grid; clock) #ff = FunctionField{Nothing, Nothing, Face}(w_GOC, grid) # ## Grid