diff --git a/Plant.jl b/Plant.jl index 9c3aea8910ac1947c74b6e60104cf256993554a4..0e1da152c2e9e470d752a2e794b4f81e48fdbc30 100644 --- a/Plant.jl +++ b/Plant.jl @@ -65,76 +65,52 @@ module Plant abstract type PhotosynthesisOrgan <: GrowingOrgan end # Organs that can photosynthesize @with_kw mutable struct OrganInfo - BB::BranchBase - Species::Int64 - PlantNumber::Int64 - Order::Int64 + BB::BranchBase # Every organ belongs to a specific branch which has a branch base object that stores variables of that branch + Species::Int64 # Species number to which organ belongs + PlantNumber::Int64 # Plant number to which organ belongs + Order::Int64 # Order, nr of branches removed from main stem (0: main stem) - Age::Int64 = 0 - AgeDD::Float64 = 0.0 + Age::Int64 = 0 # Age in days + AgeDD::Float64 = 0.0 # Age in degree days end @with_kw mutable struct GrowthVars - PotentialBiomass::Float64 - GrowthDuration::Float64 - MaxGrowthAge::Float64 - GrowthRespiration::Float64 - MaxSinkStrength::Float64 - - Biomass::Float64 = 0.0 - Growth::Float64 = 0.0 - SinkStrength::Float64 = 0.0 - AssimilatesAvailable::Float64 = 0.0 - AssimilatesAllocated::Float64 = 0.0 - Area::Float64 = 0.0 + PotentialBiomass::Float64 # Potential maximum biomass of organ + GrowthDuration::Float64 # Duration of organ growth (days) + MaxGrowthAge::Float64 # Age of organ at which organ growth is highest + GrowthRespiration::Float64 # Growth respiration of organ (fraction of biomass) + MaxSinkStrength::Float64 # Maximum possible sink strength of organ + + Biomass::Float64 = 0.0 # Biomass of organ (g) + Growth::Float64 = 0.0 # Growth rate of organ at current time point + SinkStrength::Float64 = 0.0 # Sink strength of organ at current time point + AssimilatesAvailable::Float64 = 0.0 # Amount of assimilates that are available for organ growth at this time step (mg) + AssimilatesAllocated::Float64 = 0.0 # Amount of assimilates that are allocated for organ growth at this time step (mg) + Area::Float64 = 0.0 # Area of organ end @with_kw mutable struct PhotosynthesisVars - Assimilated::Float64 = 0.0 + Assimilated::Float64 = 0.0 # Amount of CO2 acquired at current time point (mol CO2) end # Define internode @with_kw mutable struct Internode <: PhotosynthesisOrgan - OI::OrganInfo - GV::GrowthVars - PV::PhotosynthesisVars - #BB::BranchBase # Every internode belongs to a specific branch which has a branch base object that stores variables of that branch - #Species::Int64 # Species number to which internode belongs - #PlantNumber::Int64 # Plant number to which internode belongs - #Order::Int64 # Order of internode, nr of branches removed from main stem (0: main stem) + OI::OrganInfo # Object containing general organ information + GV::GrowthVars # Object containing growth variables + PV::PhotosynthesisVars # Object containing photosynthesis variables SIL::Float64 # Specific internode length: ratio of internode length per biomass (mm/mg) // Parameter - #PotentialBiomass::Float64 # Potential maximum biomass of internode // Parameter - #GrowthDuration::Float64 # Duration of internode growth (days) // Parameter - #MaxGrowthAge::Float64 # Age of internode at which internode growth is highest // Parameter - #GrowthRespiration::Float64 # Growth respiration of internode (fraction of biomass) // Parameter - #MaxSinkStrength::Float64 # Maximum possible sink strength of internode - - #Age::Int64 = 0 # Age of internode in days - #AgeDD::Float64 = 0.0 # Age of internode in degree days + Length::Float64 = 0.0 # Length of internode - Width::Float64 = 0.0 # Width of internode - #Biomass::Float64 = 0.0 # Biomass of internode (g) - #Growth::Float64 = 0.0 # Growth rate of internode at current time point - #SinkStrength::Float64 = 0.0 # Sink strength of internode at current time point - #AssimilatesAvailable::Float64 = 0.0 # Amount of assimilates that are available for internode growth at this time step (mg) - #AssimilatesAllocated::Float64 = 0.0 # Amount of assimilates that are allocated for internode growth at this time step (mg) - #Area::Float64 = 0.0 # Area of internode - #Assimilated::Float64 = 0.0 # Amount of CO2 acquired at current time point (mol CO2) + Width::Float64 = 0.0 # Width of internode end # Define meristem, the organ that is the source of phytomer creation @with_kw mutable struct Meristem <: Organ - OI::OrganInfo - #BB::BranchBase # Every meristem belongs to a specific branch which has a branch base object that stores variables of that branch - #Species::Int64 # Species number to which meristem belongs - #PlantNumber::Int64 # Plant number to which meristem belongs + OI::OrganInfo # Object containing general organ information Phyllotaxis::Float64 # Phyllotaxis for phytomer construction (degrees) // Parameter - #Order::Int64 # Order of meristem, nr of branches removed from main stem (0: main stem) Rank::Int64 # Phytomer rank of meristem ParentRank::Int64 = 0 # Rank of parent phytomer - #Age::Int64 = 0 # Age of meristem in days - #AgeDD::Float64 = 0.0 # Age of meristem in degree days Dormant::Bool = true # Whether the meristem can develop Dominance::Float64 = 0.0 # Dominance of the meristem, deciding factor in branching PhytomerNumber::Int64 = 0 # Number of phytomers from meristem to base @@ -142,30 +118,12 @@ module Plant # Define leaf @with_kw mutable struct Leaf <: PhotosynthesisOrgan - OI::OrganInfo - GV::GrowthVars - PV::PhotosynthesisVars - #BB::BranchBase # Every leaf belongs to a specific branch which has a branch base object that stores variables of that branch - #Species::Int64 # Species number to which leaf belongs - #PlantNumber::Int64 # Plant number to which leaf belongs - #Order::Int64 # Order of leaf, nr of branches removed from main stem (0: main stem) + OI::OrganInfo # Object containing general organ information + GV::GrowthVars # Object containing growth variables + PV::PhotosynthesisVars # Object containing photosynthesis variables Angle::Float64 # Angle of leaf insertion at phytomer construction // Parameter? - #PotentialBiomass::Float64 # Potential maximum biomass of leaf // Parameter - #GrowthDuration::Float64 # Duration of leaf growth (days) // Parameter - #MaxGrowthAge::Float64 # Age of leaf at which leaf growth is highest // Parameter - #GrowthRespiration::Float64 # Growth respiration of leaf (fraction of biomass) // Parameter - #MaxSinkStrength::Float64 # Maximum possible sink strength of leaf - - #Age::Int64 = 0 # Age of leaf in days - #AgeDD::Float64 = 0.0 # Age of leaf in degree days + Size::Float64 = 0.0 # Size of leaf - #Biomass::Float64 = 0.0 # Biomass of leaf (g) - #Growth::Float64 = 0.0 # Growth rate of leaf at current time point - #SinkStrength::Float64 = 0.0 # Sink strength of leaf at current time point - #AssimilatesAvailable::Float64 = 0.0 # Amount of assimilates that are available for leaf growth at this time step (mg) - #AssimilatesAllocated::Float64 = 0.0 # Amount of assimilates that are allocated for leaf growth at this time step (mg) - #Area::Float64 = 0.0 # Area of leaf - #Assimilated::Float64 = 0.0 # Amount of CO2 acquired at current time point (mol CO2) end @with_kw mutable struct Seed <: VPL.Node @@ -174,12 +132,7 @@ module Plant Endosperm::Float64 # Biomass in seed (mg) end - ## - ## - ## TRY MACROS. SEE BOOKMARK - ## - ## - + # Add methods for getproperty function such that the composite fields can be accessed directly function Base.getproperty(O::Organ, S::Symbol) if hasfield(OrganInfo, S) return getfield(O.OI, S) @@ -192,22 +145,6 @@ module Plant end end - #=function Base.getproperty(GO::GrowingOrgan, S::Symbol) - if hasfield(GrowthVars, S) - return getfield(GO.GV, S) - else - return getfield(GO, S) - end - end - - function Base.getproperty(PO::PhotosynthesisOrgan, S::Symbol) - if hasfield(PhotosynthesisVars, S) - return getfield(PO.PV, S) - else - return getfield(PO, S) - end - end - =# function Base.setproperty!(O::Organ, S::Symbol, X) if hasfield(OrganInfo, S) return setfield!(O.OI, S, X) @@ -220,23 +157,6 @@ module Plant end end - #=function Base.setproperty!(GO::GrowingOrgan, S::Symbol, X) - if hasfield(GrowthVars, S) - return setfield!(GO.GV, S, X) - else - return setfield!(GO, S, X) - end - end - - function Base.setproperty!(PO::PhotosynthesisOrgan, S::Symbol, X) - if hasfield(PhotosynthesisVars, S) - return setfield!(PO.PV, S, X) - else - return setfield!(PO, S, X) - end - end - =# - # Define organ creation functions function createInternode(MR, BB, Order) Species = data(MR).Species @@ -332,10 +252,10 @@ module Plant Leaves = apply(Plant, getLeaf) SourceStrength::Float64 = 0.0 if length(Internodes) > 0 - SourceStrength += sum([x.SinkStrength for x in Internodes]) + SourceStrength += sum([x.Assimilated for x in Internodes]) end if length(Leaves) > 0 - SourceStrength += sum([x.SinkStrength for x in Leaves]) + SourceStrength += sum([x.Assimilated for x in Leaves]) end PB.Substrates = max(((SourceStrength * MassCO2 * 0.001) - (PB.Respiration * PB.Biomass)) * ConversionCO2 + PB.ReservePool, 0) if length(Internodes) + length(Leaves) > 0