Source code for openalea.respiwheat.model
# -*- coding: latin-1 -*-
from __future__ import division # use '//' to do integer division
"""
respiwheat.model
~~~~~~~~~~~~~~~~~~~
Model of respiration based on Thornley and Cannell, 2000.
The model computes the respiration associated with the main biological processes.
R_total = sum(R_growth) + R_phloem + R_Namm_upt + R_Nnit_upt + R_Nnit_red(shoot + root) + R_N2fix + R_min_upt + sum(R_residual)
"""
[docs]
class RespirationModel(object):
SECOND_TO_HOUR_RATE_CONVERSION = 3600
# R_growth#
YG = 0.75 # 0.8 # Growth yield (units of C appearing in new biomass per unit of C substrate utilized for growth). Range 0±75 to 0±85 in Cannell and Thornley, 2000.
YG_GRAINS = 0.71 # Growth yield (units of C appearing in new biomass per unit of C substrate utilized for growth)
# R_phloem#
CPHLOEM = 0.006 # Units C respired per unit C substrate loaded into the phloem
# R_Namm_upt#
C_AMM_UPT = 0.198 # µmol of C substrate respired per µmol of N ammonium taken up
# R_Nnit_upt#
C_NIT_UPT = 0.397 # µmol of C substrate respired per µmol of N nitrates taken up
# R_Nnit_red#
F_NIT_RED_SH_CS = 0.5 # fraction of nitrate reduced in shoot using C substrate rather than using excess ATP and reducing power obtained directly from photosynthesis
C_NIT_RED = 1.98 # µmol of C substrate per µmol of N nitrates reduced
# R_N2fix #
C_NFIX = 6 # kg substrate C respired (kg N fixed)-1 (in the range 5 to 12)
# R_min_upt #
CMIN_UPT = 5000 # µmol of C substrate respired per g of minerals taken up
# R_residual #
KM_MAX = 4.1E-6 # 8E-6 # 4.1E-6 # Maximum value of the maintenance constant when C is much greater than KM (µmol of C substrate respired per µmol N s-1)
KM = 1.67E3 # The Michaelis-Menten constant affinity i.e. the C substrate concentration at half the value of KM_MAX (µmol of C substrate per g of structural mass)
[docs]
@classmethod
def R_growth(cls, mstruct_growth):
""" Local growth respiration
:param float mstruct_growth: gross growth of mstruct (µmol C added in mstruct)
:return: R_growth (µmol C respired)
:rtype: float
"""
R_growth = ((1 - cls.YG) / cls.YG) * mstruct_growth
return R_growth
[docs]
@classmethod
def R_grain_growth(cls, mstruct_growth, starch_filling, mstruct):
""" Grain growth respiration
:param float mstruct_growth: gross growth of grain structure (µmol C added in grain structure)
:param float starch_filling: gross growth of grain starch (µmol C added in grain starch g-1 mstruct)
:param float mstruct: structural dry mass of organ (g)
:return: R_grain_growth_struct, R_grain_growth_starch (µmol C respired)
:rtype: (float, float)
"""
R_grain_growth_struct = ((1 - cls.YG_GRAINS) / cls.YG_GRAINS) * mstruct_growth
R_grain_growth_starch = ((1 - cls.YG_GRAINS) / cls.YG_GRAINS) * (starch_filling * mstruct)
return R_grain_growth_struct, R_grain_growth_starch
[docs]
@classmethod
def R_phloem(cls, sucrose_loading, mstruct):
""" Phloem loading respiration
:param float sucrose_loading: Loading flux from the C substrate pool to phloem (µmol C g-1 mstruct)
:param float mstruct: structural dry mass of organ (g)
:return: R_phloem, sucrose_loading (µmol C respired, µmol C)
:rtype: (float, float)
"""
R_phloem = max(0., cls.CPHLOEM * sucrose_loading * mstruct) #: Do not count a respiratory cost for negative loading i.e. unloading (assumed to be passive)
return R_phloem, sucrose_loading
[docs]
@classmethod
def R_Namm_upt(cls, U_Namm):
""" Ammonium uptake respiration
:param float U_Namm: uptake of N ammonium (µmol N)
:return: R_Namm (µmol C respired)
:rtype: float
"""
R_Namm_upt = cls.C_AMM_UPT * U_Namm
return R_Namm_upt
[docs]
@classmethod
def R_Nnit_upt(cls, U_Nnit, sucrose):
""" Nitrate uptake respiration
:param float U_Nnit: uptake of N nitrates (µmol N)
:param float sucrose: amount of C sucrose in organ (µmol C)
:return: R_Nnit_upt (µmol C respired)
:rtype: float
"""
if sucrose > 0:
R_Nnit_upt = cls.C_NIT_UPT * U_Nnit
else:
R_Nnit_upt = 0
return R_Nnit_upt
[docs]
@classmethod
def R_Nnit_red(cls, s_amino_acids, sucrose, mstruct, root=False):
""" Nitrate reduction-linked respiration
Distinction is made between nitrate realised in roots or in shoots where a part of the energy required is derived from ATP
and reducing power obtained directly from photosynthesis (rather than C substrate)
:param float s_amino_acids: consumption of N for the synthesis of amino acids (µmol N g-1 mstruct)
(in the present version, this is used to approximate nitrate reduction needed in the original model of Thornley and Cannell, 2000)
:param float sucrose: amount of C sucrose in organ (µmol C)
:param float mstruct: structural dry mass of organ (g)
:param bool root: specifies if the nitrate reduction-linked respiration is computed for shoot (False) or root (True) tissues.
:return: R_Nnit_upt, s_amino_acids (µmol C respired, µmol N g-1 mstruct)
:rtype: (float, float)
"""
if not root:
R_Nnit_red = cls.F_NIT_RED_SH_CS * cls.C_NIT_RED * s_amino_acids * mstruct # Respiration in shoot tissues
else:
R_Nnit_red = cls.C_NIT_RED * s_amino_acids * mstruct # Respiration in root tissues
if sucrose < R_Nnit_red:
R_Nnit_red = 0
s_amino_acids = 0
return R_Nnit_red, s_amino_acids
[docs]
@classmethod
def R_N2fix(cls, I_Nfix):
""" N2-fixation respiration
:param float I_Nfix: flux of fixed N into the root substrate N pool (kg fixed N)
:return: R_N2fix (µmol C respired)
:rtype: float`
"""
if I_Nfix <= 0:
R_N2fix = 0
else:
R_N2fix = cls.C_NFIX * I_Nfix
return R_N2fix
[docs]
@classmethod
def R_min_upt(cls, delta_mineral_plant):
""" Mineral ion (other than N) uptake-linked respiration
:param float delta_mineral_plant: Uptake of mineral by the plant (g)
:return: R_min_upt (µmol C respired)
:rtype float
"""
# Uptake of minerals (g)
Umin = delta_mineral_plant
# Respiratory cost
R_min_upt = cls.CMIN_UPT * Umin
return max(0., R_min_upt)
[docs]
@classmethod
def R_residual(cls, sucrose, mstruct, Ntot, Ts):
""" Residual respiration (cost from protein turn-over, cell ion gradients, futile cycles...)
:param float sucrose: amount of C sucrose (µmol C)
:param float mstruct: structural dry mass of organ (g)
:param float Ntot: total N in organ (µmol N)
:param float Ts : organ temperature (°C)
:return: R_residual (µmol C respired h-1)
:rtype: float
"""
Q10 = 2.
T_ref = 20.
if sucrose <= 0. or mstruct <= 0.:
R_residual = 0.
else:
conc_sucrose = sucrose / mstruct
R_residual = ((cls.KM_MAX * conc_sucrose) / (cls.KM + conc_sucrose)) * Ntot * Q10 ** ((Ts - T_ref) / 10) * cls.SECOND_TO_HOUR_RATE_CONVERSION
return R_residual
[docs]
@classmethod
def R_endosperm(cls, starch, mstruct, Tsoil):
""" Endosperm respiration during seed germination
:param float starch: amount of C sucrose (µmol C)
:param float mstruct: structural dry mass of organ (g)
:param float Tsoil : soil temperature (°C)
:return: R_residual (µmol C respired h-1)
:rtype: float
"""
Q10 = 2.
T_ref = 20.
if starch <= 0. or mstruct <= 0.:
R_residual = 0.
else:
R_residual = 5.21E-4 * Q10 ** ((Tsoil - T_ref) / 10) * cls.SECOND_TO_HOUR_RATE_CONVERSION
return R_residual