Source code for openalea.growthwheat.model

# -*- coding: latin-1 -*-

from __future__ import division  # use "//" to do integer division

import numpy as np

from openalea.growthwheat import parameters

"""
    growthwheat.model
    ~~~~~~~~~~~~~

    The module :mod:`growthwheat.model` defines the equations of the kinetic of leaf growth (mass flows) according to leaf elongation. Also includes root growth.

"""


[docs] def calculate_ratio_mstruct_DM(mstruct, sucrose, fructans, amino_acids, proteins): """ Ratio mstruct/dry matter (dimensionless) :param float mstruct: Strutural mass (g) :param float sucrose: Sucrose amount (µmol C) :param float fructans: Fructans amount (µmol C) :param float amino_acids: Amino acids amount (µmol N) :param float proteins: proteins amount (µmol N) :return: Ratio mstruct/dry matter (dimensionless) :rtype: float """ C_MOLAR_MASS = parameters.C_MOLAR_MASS N_MOLAR_MASS = parameters.N_MOLAR_MASS dry_mass = ((sucrose * 1E-6 * C_MOLAR_MASS) / parameters.HEXOSE_MOLAR_MASS_C_RATIO + (fructans * 1E-6 * C_MOLAR_MASS) / parameters.HEXOSE_MOLAR_MASS_C_RATIO + (amino_acids * 1E-6 * N_MOLAR_MASS) / parameters.AMINO_ACIDS_MOLAR_MASS_N_RATIO + (proteins * 1E-6 * N_MOLAR_MASS) / parameters.AMINO_ACIDS_MOLAR_MASS_N_RATIO + mstruct) return mstruct / dry_mass
[docs] def calculate_delta_leaf_enclosed_mstruct(leaf_L, delta_leaf_L, ratio_mstruct_DM): """ Relation between length and mstruct for the leaf segment located in the hidden zone during the exponential-like growth phase. Parameters alpha_mass_growth and beta_mass_growth estimated from Williams (1960) and expressed in g of dry mass) The actual ratio_mstruct_DM is then used to convert in g of structural dry mass. :param float leaf_L: Total leaf length (m) :param float delta_leaf_L: delta of leaf length (m) :param float ratio_mstruct_DM: Ratio mstruct/dry matter (dimensionless) :return: delta_leaf_enclosed_mstruct (g) :rtype: float """ return parameters.ALPHA * parameters.BETA * leaf_L ** (parameters.BETA - 1) * delta_leaf_L * ratio_mstruct_DM
[docs] def calculate_delta_leaf_enclosed_mstruct_postE(delta_leaf_pseudo_age, leaf_pseudo_age, leaf_pseudostem_L, enclosed_mstruct, LSSW): """ mstruct of the enclosed leaf from the emergence of the leaf to the end of elongation. Final mstruct of the enclosed leaf matches sheath mstruct calculation when it is mature. #TODO : Hiddenzone mstruct calculation is not correct for sheath shorten than previous one. :param float delta_leaf_pseudo_age: Delta of Pseudo age of the leaf since beginning of automate elongation (s) :param float leaf_pseudo_age: Pseudo age of the leaf since beginning of automate elongation (s) :param float leaf_pseudostem_L: Pseudostem length (m) :param float enclosed_mstruct: mstruct of the enclosed leaf (g) :param float LSSW: Lineic Structural Sheath Weight (g m-1). :return: delta_leaf_enclosed_mstruct (g) :rtype: float """ enclosed_mstruct_max = leaf_pseudostem_L * LSSW if leaf_pseudo_age < parameters.te: delta_enclosed_mstruct = (enclosed_mstruct_max - enclosed_mstruct) / (parameters.te - leaf_pseudo_age) * delta_leaf_pseudo_age else: delta_enclosed_mstruct = 0 return max(0., delta_enclosed_mstruct)
[docs] def calculate_delta_internode_enclosed_mstruct(internode_L, delta_internode_L, ratio_mstruct_DM): """ Relation between length and mstruct for the internode segment located in the hidden zone. Same relationship than for enclosed leaf corrected by RATIO_ENCLOSED_LEAF_INTERNODE. Parameters alpha_mass_growth and beta_mass_growth estimated from Williams (1975) and expressed in g of dry mass. The actual ratio_mstruct_DM is then used to convert in g of structural dry mass. :param float internode_L: Enclosed internode length (m) :param float delta_internode_L: delta of enclosed internode length (m) :param float ratio_mstruct_DM: Ratio mstruct/dry matter (dimensionless) :return: delta_enclosed_internode_mstruct (g) :rtype: float """ return parameters.RATIO_ENCLOSED_LEAF_INTERNODE * parameters.ALPHA * parameters.BETA * internode_L ** (parameters.BETA - 1) * delta_internode_L * ratio_mstruct_DM
[docs] def calculate_delta_internode_enclosed_mstruct_postL(delta_internode_pseudo_age, internode_pseudo_age, internode_L, internode_pseudostem_L, internode_Lmax, LSIW, enclosed_mstruct): """ mstruct of the enclosed internode from the ligulation of the leaf to the end of elongation. Final mstruct of the enclosed internode matches internode mstruct calculation when it is mature. :param float delta_internode_pseudo_age: Delta of Pseudo age of the internode since beginning of automate elongation (s) :param float internode_pseudo_age: Pseudo age of the internode since beginning of automate elongation (s) :param float internode_L: Current lenght of the internode (m) :param float internode_pseudostem_L: Pseudostem length of the internode (m) :param float internode_Lmax: Final length of the internode (m) :param float LSIW: Lineic Structural Internode Weight (g m-1). :param float enclosed_mstruct: mstruct of the enclosed leaf (g) :return: delta_internode_enclosed_mstruct (g) :rtype: float """ if not internode_Lmax: enclosed_mstruct_max = internode_L * LSIW else: enclosed_mstruct_max = min(internode_pseudostem_L, internode_Lmax) * LSIW if internode_pseudo_age < parameters.te_IN: delta_enclosed_mstruct = (enclosed_mstruct_max - enclosed_mstruct) / (parameters.te_IN - internode_pseudo_age) * delta_internode_pseudo_age else: delta_enclosed_mstruct = 0 return max(0., delta_enclosed_mstruct)
[docs] def calculate_delta_emerged_tissue_mstruct(SW, previous_mstruct, metric): """ delta mstruct of emerged tissue (lamina, sheath and internode). Calculated from tissue area. :param float SW: For Lamina : Structural Specific Weight (g m-2); For sheath and internode : Lineic Structural Weight (g m-1) :param float previous_mstruct: mstruct at the previous time step i.e. not yet updated (g) :param float metric: For Lamina : Area at the current time step, as updated by the geometrical model (m2); For sheath and internode : Length at the current time step (m) :return: delta mstruct (g) :rtype: float """ updated_mstruct = SW * metric delta_mstruct = updated_mstruct - previous_mstruct return max(0., delta_mstruct)
[docs] def calculate_delta_Nstruct(delta_mstruct): """ delta Nstruct of hidden zone and emerged tissue (lamina and sheath). :param float delta_mstruct: delta of mstruct (g) :return: delta Nstruct (g) :rtype: float """ return delta_mstruct * parameters.RATIO_AMINO_ACIDS_MSTRUCT
[docs] def calculate_export(delta_mstruct, metabolite, hiddenzone_mstruct): """Export of metabolite from the hidden zone towards the emerged part of the leaf integrated over delta_t. :param float delta_mstruct: Delta of structural dry mass of the emerged part of the leaf (g) :param float metabolite: Metabolite amount in the hidden zone (µmol C or N) :param float hiddenzone_mstruct: Structural mass of the hidden zone (g) :return: metabolite export (µmol N) :rtype: float """ return delta_mstruct * max(0., (metabolite / hiddenzone_mstruct))
[docs] def calculate_init_cytokinins_emerged_tissue(delta_mstruct): """Initial amount of cytokinins allocated in the mstruct of a newly emerged tissue. :param float delta_mstruct: Delta of structural dry mass of the emerged part of the leaf (g) :return: cytokinins addition (AU) :rtype: float """ return delta_mstruct * parameters.INIT_CYTOKININS_EMERGED_TISSUE # TODO: Set according to protein concentration ?
[docs] def calculate_s_Nstruct_amino_acids(delta_hiddenzone_Nstruct, delta_lamina_Nstruct, delta_sheath_Nstruct, delta_internode_Nstruct): """Consumption of amino acids for the calculated mstruct growth (µmol N consumed by mstruct growth) :param float delta_hiddenzone_Nstruct: Nstruct growth of the hidden zone (g) :param float delta_lamina_Nstruct: Nstruct growth of the lamina (g) :param float delta_sheath_Nstruct: Nstruct growth of the sheath (g) :param float delta_internode_Nstruct: Nstruct growth of the internode (g) :return: Amino acid consumption (µmol N) :rtype: float """ return (delta_hiddenzone_Nstruct + delta_lamina_Nstruct + delta_sheath_Nstruct + delta_internode_Nstruct) / parameters.N_MOLAR_MASS * 1E6
[docs] def calculate_s_mstruct_sucrose(delta_hiddenzone_mstruct, delta_lamina_mstruct, delta_sheath_mstruct, s_Nstruct_amino_acids_N): """Consumption of sucrose for the calculated mstruct growth (µmol C consumed by mstruct growth) :param float delta_hiddenzone_mstruct: mstruct growth of the hidden zone (g) :param float delta_lamina_mstruct: mstruct growth of the lamina (g) :param float delta_sheath_mstruct: mstruct growth of the sheath (g) :param float s_Nstruct_amino_acids_N: Total amino acid consumption (µmol N) due to Nstruct (µmol N) :return: Sucrose consumption (µmol C) :rtype: float """ s_Nstruct_amino_acids = s_Nstruct_amino_acids_N / parameters.AMINO_ACIDS_N_RATIO #: µmol of AA s_mstruct_amino_acids_C = s_Nstruct_amino_acids * parameters.AMINO_ACIDS_C_RATIO #: µmol of C coming from AA s_mstruct_C = (delta_hiddenzone_mstruct + delta_lamina_mstruct + delta_sheath_mstruct) * parameters.RATIO_SUCROSE_MSTRUCT / parameters.C_MOLAR_MASS * 1E6 #: Total C used for mstruct growth (µmol C) s_mstruct_sucrose_C = s_mstruct_C - s_mstruct_amino_acids_C #: µmol of C coming from sucrose return s_mstruct_sucrose_C
[docs] def calculate_sheath_mstruct(sheath_L, LSSW): """ mstruct of the sheath. Final mstruct of the enclosed leaf matches sheath mstruct calculation when it is mature. :param float sheath_L: Sheath length (m) :param float LSSW: Lineic Structural Sheath Weight (g m-1). :return: Structural mass of the sheath (g) :rtype: float """ return sheath_L * LSSW
[docs] def calculate_roots_mstruct_growth(sucrose, amino_acids, mstruct, delta_teq, postflowering_stages): """Root structural dry mass growth integrated over delta_t :param float sucrose: Amount of sucrose in roots (µmol C) :param float amino_acids: Amount of amino acids in roots (µmol N) :param float mstruct: Root structural mass (g) :param float delta_teq: Time compensated for the effect of temperature - Time equivalent at Tref (s) :param bool postflowering_stages: Option : True to run a simulation with postflo parameter :return: mstruct_C_growth (µmol C), mstruct_growth (g), Nstruct_growth (g), Nstruct_N_growth (µmol N) :rtype: (float, float, float, float) """ conc_sucrose_effective = max(0., sucrose / mstruct - parameters.conc_sucrose_offset) if postflowering_stages: Vmax = parameters.VMAX_ROOTS_GROWTH_POSTFLO else: Vmax = parameters.VMAX_ROOTS_GROWTH_PREFLO N = parameters.N_ROOTS_GROWTH if conc_sucrose_effective > 0.: mstruct_C_growth = max(0., ((conc_sucrose_effective ** N) * Vmax) / ((conc_sucrose_effective ** N) + (parameters.K_ROOTS_GROWTH ** N)) * delta_teq * mstruct) #: root growth in C (µmol of C) else: mstruct_C_growth = 0. mstruct_growth = mstruct_C_growth * parameters.CONVERSION_MMOL_C_G_MSTRUCT_ROOTS #: root growth (g of structural dry mass) Nstruct_growth = mstruct_growth * parameters.RATIO_N_MSTRUCT_ROOTS_ #: root growth in N (g of structural dry mass) Nstruct_N_growth = min(amino_acids, (Nstruct_growth / parameters.N_MOLAR_MASS) * 1E6) #: root growth in nitrogen (µmol N) return mstruct_C_growth, mstruct_growth, Nstruct_growth, Nstruct_N_growth
[docs] def calculate_roots_s_mstruct_sucrose(delta_roots_mstruct, s_Nstruct_amino_acids_N): """Consumption of sucrose for the calculated mstruct growth (µmol C consumed by mstruct growth) :param float delta_roots_mstruct: mstruct growth of the roots (g) :param float s_Nstruct_amino_acids_N: Total amino acid consumption (µmol N) due to Nstruct (µmol N) :return: Sucrose consumption (µmol C) :rtype: float """ s_Nstruct_amino_acids = s_Nstruct_amino_acids_N / parameters.AMINO_ACIDS_N_RATIO #: µmol of AA s_mstruct_amino_acids_C = s_Nstruct_amino_acids * parameters.AMINO_ACIDS_C_RATIO #: µmol of C coming from AA s_mstruct_C = delta_roots_mstruct * parameters.RATIO_SUCROSE_MSTRUCT / parameters.C_MOLAR_MASS * 1E6 #: Total C used for mstruct growth (µmol C) s_mstruct_sucrose_C = s_mstruct_C - s_mstruct_amino_acids_C #: µmol of coming from sucrose return s_mstruct_sucrose_C
[docs] def calculate_mineral_plant(mstruct, senesced_mstruct): """ Mineral mass. :param float mstruct: structural mass of the plant (g) :param float senesced_mstruct: senesced structural mass of the plant (g) :return: Mineral mass of the plant (g) :rtype: float """ mineral_plant = (mstruct * parameters.MINERAL_LIVING_TISSUE) + (senesced_mstruct * parameters.MINERAL_SENESCED_TISSUE) return mineral_plant