Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
Persefone.jl
Manage
Activity
Members
Plan
Wiki
Code
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Locked files
Deploy
Package registry
Model registry
Operate
Terraform modules
Analyze
Contributor analytics
Repository analytics
Insights
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Persefone
Persefone.jl
Commits
0fd99174
Commit
0fd99174
authored
1 year ago
by
xo30xoqa
Browse files
Options
Downloads
Patches
Plain Diff
Implemented equations for dynamic energy budgets
parent
c5c8f603
No related branches found
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
src/nature/energy.jl
+174
-31
174 additions, 31 deletions
src/nature/energy.jl
with
174 additions
and
31 deletions
src/nature/energy.jl
+
174
−
31
View file @
0fd99174
...
@@ -3,6 +3,9 @@
...
@@ -3,6 +3,9 @@
### This file contains structs and functions for implementing Dynamic Energy Budgets.
### This file contains structs and functions for implementing Dynamic Energy Budgets.
###
###
## STRUCTS
"""
"""
DEBparameters
DEBparameters
...
@@ -10,13 +13,18 @@ An immutable struct to save the parameter list for a species' Dynamic Energy Bud
...
@@ -10,13 +13,18 @@ An immutable struct to save the parameter list for a species' Dynamic Energy Bud
model. (See Sousa et al., 2010.)
model. (See Sousa et al., 2010.)
"""
"""
struct
DEBparameters
struct
DEBparameters
maxsearchrate
::
Float64
# maximum amount of food handled per day (F_m)
assimilation
::
Float64
# percentage of food biomass assimilated (y_EX)
assimilation
::
Float64
# percentage of food biomass assimilated (y_EX)
growthefficiency
::
Float64
# yield of structure on reserve (y_VE)
v
::
Float64
# energy conductance
surfacesomaticmaintenance
::
Float64
# surface-specific somatic maintenance (J_ET)
volumesomaticmaintenance
::
Float64
# volume-specific somatic maintenance (J_EM)
#maturitymaintenance::Float64 # specific maturity maintenance (k_J)
kappa
::
Float64
# percentage allocated to somatic maintenance and growth (k)
kappa
::
Float64
# percentage allocated to somatic maintenance and growth (k)
juvenilesize
::
Float64
# structure size at which an embryo becomes a juvenile (MHb)
reproductionefficiency
::
Float64
# overhead cost of reproduction (k_R)
adultsize
::
Float64
# structure size at which a juvenile becomes an adult (MHp)
eggsize
::
Float64
# weight of an egg/embryo, = initial amount of reserve (M_E0)
maintenance
::
Float64
# daily percentage of body size needed per update for somatic and maturity maintenance
juvenilesize
::
Float64
# structure size at which an embryo becomes a juvenile (M_Hb)
reproduction
::
Float64
# energy needed to produce an egg (= initial amount of reserve)
adultsize
::
Float64
# structure size at which a juvenile becomes an adult (M_Hp)
v
::
Float64
# energy conductance (XXX ???)
end
end
"""
"""
...
@@ -50,32 +58,111 @@ Ecology, 85(7), 1771–1789. https://doi.org/10.1890/03-9000
...
@@ -50,32 +58,111 @@ Ecology, 85(7), 1771–1789. https://doi.org/10.1890/03-9000
"""
"""
mutable struct
EnergyBudget
mutable struct
EnergyBudget
params
::
DEBparameters
params
::
DEBparameters
reserve
::
Float64
reserve
::
Float64
# M_E
structure
::
Float64
structure
::
Float64
# M_V
offspring
::
Float64
#maturity::Float64 # M_H
offspring
::
Float64
# M_ER
end
end
## INTERNAL CALCULATIONS
"""
"""
biomass
(energybudget)
volumetriclength
(energybudget)
Calculate the
total biomass
o
f
an individual
based on its energy budget.
Calculate the
structural length in cm based
o
n
an individual
's weight
(
Sum of the reserve, structure, and offspring buffers; Sibly et al. 2013.)
(
assuming a density of 1 g/cm³ to calculate volume, see Kooijman 2009).
"""
"""
function
biomass
(
deb
::
EnergyBudget
)
function
volumetriclength
(
deb
::
EnergyBudget
)
deb
.
reserve
+
deb
.
structure
+
deb
.
offspring
#TODO is cm the right unit?
weight
=
deb
.
reserve
+
deb
.
structure
+
deb
.
offspring
vlength
=
weight
^
(
1
/
3
)
vlength
end
end
"""
"""
feed!(biomass,
energybudget)
maturitymaintenance(
energybudget)
Consume a given quantity of food. Expands the energy reserve by an
Calculate the specific maturity maintenance k_J.
amount determined by the assimilation rate.
(Internal function.)
"""
function
maturitymaintenance
(
deb
::
EnergyBudget
)
y_VE
=
deb
.
params
.
growthefficiency
J_EM
=
deb
.
params
.
volumesomaticmaintenance
M_V
=
deb
.
structure
k_J
=
(
y_VE
*
J_EM
)
/
M_V
k_J
end
"""
scaledreservedensity(energybudget)
Calculate the scaled reserve density e.
(Internal function.)
"""
"""
function
feed!
(
biomass
::
Float64
,
deb
::
EnergyBudget
)
function
scaledreservedensity
(
deb
::
EnergyBudget
)
deb
.
reserve
+=
biomass
*
deb
.
params
.
assimilation
J_EAm
=
deb
.
params
.
assimilation
*
deb
.
params
.
maxsearchrate
#TODO reserve doesn't grow infinitely
m_E
=
deb
.
reserve
/
deb
.
structure
m_Em
=
J_EAm
/
(
deb
.
params
.
v
*
deb
.
structure
)
e
=
m_E
/
m_Em
e
end
end
"""
investmentratio(energybudget)
Calculate the investment ratio g.
(Internal function.)
"""
function
investmentratio
(
deb
::
EnergyBudget
)
J_EAm
=
deb
.
params
.
assimilation
*
deb
.
params
.
maxsearchrate
y_VE
=
deb
.
params
.
growthefficiency
k
=
deb
.
params
.
kappa
v
=
deb
.
params
.
v
M_V
=
deb
.
structure
g
=
(
v
*
M_V
)
/
(
k
*
J_EAm
*
y_VE
)
g
end
"""
growthrate(energybudget)
Calculate the specific growth rate r.
(Internal function.)
"""
function
growthrate
(
deb
::
EnergyBudget
)
J_EAm
=
deb
.
params
.
assimilation
*
deb
.
params
.
maxsearchrate
J_ET
=
deb
.
params
.
surfacesomaticmaintenance
J_EM
=
deb
.
params
.
volumesomaticmaintenance
k
=
deb
.
params
.
kappa
v
=
deb
.
params
.
v
e
=
scaledreservedensity
(
deb
)
g
=
investmentratio
(
deb
)
L
=
volumetriclength
(
deb
)
L_m
=
k
*
(
J_EAm
/
J_EM
)
# max length
L_T
=
J_ET
/
J_EM
# heating length
r
=
v
*
(
e
/
L
-
(
1
+
L_T
/
L
)
/
L_m
)
/
(
e
+
g
)
r
end
"""
mobilisation(energybudget)
Calculate the mobilisation rate J_EC.
(Internal function.)
"""
function
mobilisation
(
deb
::
EnergyBudget
)
M_E
=
deb
.
reserve
r
=
growthrate
(
deb
)
v
=
deb
.
params
.
v
L
=
volumetriclength
(
deb
)
J_EC
=
M_E
*
(
v
/
L
-
r
)
J_EC
end
## PUBLIC INTERFACE
"""
"""
update!(energybudget)
update!(energybudget)
...
@@ -86,25 +173,76 @@ Return `true` if the individual has enough energy to survive, or `false` if the
...
@@ -86,25 +173,76 @@ Return `true` if the individual has enough energy to survive, or `false` if the
reserve is empty and it starves.
reserve is empty and it starves.
"""
"""
function
update!
(
deb
::
EnergyBudget
)
function
update!
(
deb
::
EnergyBudget
)
#TODO
J_ET
=
deb
.
params
.
surfacesomaticmaintenance
mobilisation
=
0
J_EM
=
deb
.
params
.
volumesomaticmaintenance
somaticmaintenance
=
deb
.
params
.
maintenance
# J_ES
k_R
=
deb
.
params
.
reproductionefficiency
maturitymaintenance
=
deb
.
params
.
maintenance
# J_EJ
y_VE
=
deb
.
params
.
growthefficiency
#k_J = deb.params.maturitymaintenance
k_J
=
maturitymaintenance
(
deb
)
L
=
volumetriclength
(
deb
)
k
=
deb
.
params
.
kappa
M_V
=
deb
.
structure
#M_H = deb.maturity
M_E
=
deb
.
reserve
J_EC
=
mobilisation
(
deb
)
## Somatic maintenance and growth
J_ES
=
J_EM
*
(
L
^
3
)
+
J_ET
*
(
L
^
2
)
# somatic maintenance
J_EG
=
J_EC
*
k
-
J_ES
# energy devoted to growth
J_VG
=
J_EG
*
y_VE
# actual growth
#J_VG = growthrate(deb) * deb.structure # r*M_V
#XXX check if J_VG == J_EG * y_VE == r * M_V
deb
.
structure
+=
J_VG
# juveniles grow until they reach adult size
# juveniles grow until they reach adult size
#XXX growth should stop automatically at M_V == M_Hp
if
deb
.
structure
<
adultsize
if
deb
.
structure
<
adultsize
growth
=
(
mobilisation
*
deb
.
params
.
kappa
)
-
somaticmaintenance
growth
=
(
mobilisation
*
deb
.
params
.
kappa
)
-
somaticmaintenance
deb
.
structure
+=
growth
deb
.
structure
+=
growth
end
end
# juveniles increase in maturity, adults invest into reproduction
# juveniles increase in maturity, adults invest into reproduction
maturityreproduction
=
(
mobilisation
*
(
1
-
deb
.
params
.
kappa
))
-
maturitymaintenance
J_EJ
=
k_J
*
M_H
# maturity maintenance
if
deb
.
structure
>=
adultsize
J_ER
=
J_EC
*
(
1
-
k
)
-
J_EJ
# resources for reproduction
deb
.
offspring
+=
maturityreproduction
if
M_V
>=
deb
.
params
.
adultsize
deb
.
offspring
+=
J_ER
*
k_R
else
#deb.maturity += J_ER #XXX I'm ignoring the maturity buffer for now
end
end
deb
.
reserve
-=
mobilisation
#XXX Check that J_EC == J_ES + J_EG + J_EJ + J_ER
deb
.
reserve
-=
J_EC
return
deb
.
reserve
>
0
return
deb
.
reserve
>
0
end
end
"""
feed!(quantity, energybudget)
Consume a given quantity of food. Expands the energy reserve by an
amount determined by the assimilation rate. Returns `true` if successful,
`false` if the reserve is already full.
"""
function
feed!
(
quantity
::
Float64
,
deb
::
EnergyBudget
)
F_m
=
deb
.
params
.
maxsearchrate
y_EX
=
deb
.
params
.
assimilation
M_V
=
deb
.
structure
M_E
=
deb
.
reserve
v
=
deb
.
params
.
v
J_EAm
=
y_EX
*
F_m
# max assimilation rate
m_E
=
M_E
/
M_V
# reserve density
m_Em
=
J_EAm
/
(
v
*
M_V
)
# max reserve density
# only feed if the reserve is not yet at maximum capacity
if
m_E
<
m_Em
deb
.
reserve
+=
quantity
*
y_EX
return
true
else
return
false
end
end
"""
"""
reproduce!(energybudget)
reproduce!(energybudget)
...
@@ -113,9 +251,14 @@ embryo/egg, reducing the parent energy in the process. Returns the embryo's ener
...
@@ -113,9 +251,14 @@ embryo/egg, reducing the parent energy in the process. Returns the embryo's ener
budget, or `nothing` if the conditions are not met.
budget, or `nothing` if the conditions are not met.
"""
"""
function
reproduce!
(
deb
::
EnergyBudget
)
function
reproduce!
(
deb
::
EnergyBudget
)
if
deb
.
structure
>=
deb
.
params
.
adultsize
&&
deb
.
offspring
>=
deb
.
params
.
reproduction
M_V
=
deb
.
structure
deb
.
offspring
-=
deb
.
params
.
reproduction
M_ER
=
deb
.
offspring
return
EnergyBudget
(
deb
.
params
,
deb
.
params
.
reproduction
,
0.0
,
0.0
)
M_Hp
=
deb
.
params
.
adultsize
M_E0
=
deb
.
params
.
eggsize
if
M_V
>=
M_Hp
&&
M_ER
>=
M_E0
deb
.
offspring
-=
M_E0
return
EnergyBudget
(
deb
.
params
,
M_E0
,
0.0
,
0.0
)
else
else
return
nothing
return
nothing
end
end
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment