Source code for openalea.growthwheat.simulation

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

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

import copy

from openalea.growthwheat import model
from openalea.growthwheat import parameters

from openalea.respiwheat.model import RespirationModel

"""
    growthwheat.simulation
    ~~~~~~~~~~~~~~~~~~

    The module :mod:`growthwheat.simulation`.

"""

#: the inputs needed by GrowthWheat
HIDDENZONE_INPUTS = ['leaf_is_growing', 'internode_is_growing', 'leaf_pseudo_age', 'delta_leaf_pseudo_age', 'internode_pseudo_age', 'delta_internode_pseudo_age', 'leaf_L', 'delta_leaf_L',
                     'internode_L', 'delta_internode_L', 'leaf_pseudostem_length',
                     'delta_leaf_pseudostem_length', 'internode_distance_to_emerge', 'delta_internode_distance_to_emerge', 'SSLW', 'LSSW', 'LSIW', 'leaf_is_emerged', 'internode_is_visible',
                     'sucrose', 'amino_acids', 'fructan', 'proteins', 'leaf_enclosed_mstruct', 'leaf_enclosed_Nstruct', 'internode_enclosed_mstruct',
                     'internode_enclosed_Nstruct', 'mstruct', 'internode_Lmax', 'leaf_Lmax', 'sheath_Lmax', 'is_over', 'leaf_is_remobilizing', 'internode_is_remobilizing']
ELEMENT_INPUTS = ['is_growing', 'mstruct', 'senesced_mstruct', 'green_area', 'length', 'sucrose', 'amino_acids', 'fructan', 'proteins', 'cytokinins', 'Nstruct']
ROOT_INPUTS = ['sucrose', 'amino_acids', 'mstruct', 'Nstruct']
AXIS_INPUTS = ['delta_teq', 'delta_teq_roots']

#: the outputs computed by GrowthWheat
HIDDENZONE_OUTPUTS = ['sucrose', 'amino_acids', 'fructan', 'proteins', 'leaf_enclosed_mstruct', 'leaf_enclosed_Nstruct', 'internode_enclosed_mstruct', 'internode_enclosed_Nstruct', 'mstruct',
                      'Nstruct', 'Respi_growth', 'sucrose_consumption_mstruct', 'AA_consumption_mstruct', 'is_over', 'leaf_is_remobilizing', 'internode_is_remobilizing']
ELEMENT_OUTPUTS = ['sucrose', 'amino_acids', 'fructan', 'proteins', 'nitrates', 'mstruct', 'Nstruct',
                   'green_area', 'max_proteins', 'max_mstruct', 'Nresidual', 'senesced_length_element', 'senesced_mstruct']
ROOT_OUTPUTS = ['sucrose', 'amino_acids', 'mstruct', 'Nstruct', 'Respi_growth', 'R_min_upt', 'delta_mstruct_growth', 'sucrose_consumption_mstruct', 'AA_consumption_mstruct']
AXIS_OUTPUTS = []

#: the inputs and outputs of GrowthWheat.
HIDDENZONE_INPUTS_OUTPUTS = sorted(set(HIDDENZONE_INPUTS + HIDDENZONE_OUTPUTS))
ELEMENT_INPUTS_OUTPUTS = sorted(set(ELEMENT_INPUTS + ELEMENT_OUTPUTS))
ROOT_INPUTS_OUTPUTS = sorted(set(ROOT_INPUTS + ROOT_OUTPUTS))
AXIS_INPUTS_OUTPUTS = sorted(set(AXIS_INPUTS + AXIS_OUTPUTS))


[docs] class SimulationError(Exception): pass
[docs] class SimulationRunError(SimulationError): pass
[docs] class Simulation(object): """The Simulation class permits to initialize and run a simulation. """ def __init__(self, delta_t=1, update_parameters=None): #: The inputs of growth-Wheat. #: #: `inputs` is a dictionary of dictionaries: #: {'hiddenzone': {(plant_index, axis_label, metamer_index): {hiddenzone_input_name: hiddenzone_input_value, ...}, ...}, #: 'elements': {(plant_index, axis_label, metamer_index, organ_label, element_label): {organ_input_name: organ_input_value, ...}, ...}, #: 'roots': {(plant_index, axis_label): {root_input_name: root_input_value, ...}, ...}} #: See :TODO? #: for more information about the inputs. self.inputs = {} #: The outputs of growth-Wheat. #: #: `outputs` is a dictionary of dictionaries: #: {'hiddenzone': {(plant_index, axis_label, metamer_index): {hiddenzone_input_name: hiddenzone_input_value, ...}, ...}, #: 'elements': {(plant_index, axis_label, metamer_index, organ_label, element_label): {organ_input_name: organ_input_value, ...}, ...} #: 'roots': {(plant_index, axis_label): {root_input_name: root_input_value, ...}, ...}} #: See :TODO? #: for more information about the inputs. self.outputs = {} #: the delta t of the simulation (in seconds) self.delta_t = delta_t #: Update parameters if specified if update_parameters: parameters.__dict__.update(update_parameters)
[docs] def initialize(self, inputs): """ Initialize :attr:`inputs` from `inputs`. :param dict inputs: must be a dictionary with the same structure as :attr:`inputs`. """ self.inputs.clear() self.inputs.update(inputs)
[docs] def run(self, postflowering_stages=False): """ Run the simulation. :param bool postflowering_stages: if True the model will calculate root growth with the parameters calibrated for post flowering stages """ # Copy the inputs into the output dict self.outputs.update({inputs_type: copy.deepcopy(all_inputs) for inputs_type, all_inputs in self.inputs.items() if inputs_type in {'hiddenzone', 'elements', 'roots', 'axes'}}) # Hidden growing zones all_hiddenzone_inputs = self.inputs['hiddenzone'] all_hiddenzone_outputs = self.outputs['hiddenzone'] # elements all_elements_inputs = self.inputs['elements'] all_elements_outputs = self.outputs['elements'] # roots all_roots_inputs = self.inputs['roots'] all_roots_outputs = self.outputs['roots'] # axes all_axes_inputs = self.inputs['axes'] all_axes_outputs = self.outputs['axes'] # ---------------------------------------------- # ----------- Hiddenzones and elements --------- # ---------------------------------------------- for hiddenzone_id, hiddenzone_inputs in sorted(all_hiddenzone_inputs.items()): curr_hiddenzone_outputs = all_hiddenzone_outputs[hiddenzone_id] axe_label = hiddenzone_id[1] #: Tillers (we copy corresponding elements of MS) if axe_label != 'MS': # TODO: temporary or should be an option at least pass #: Main stem else: # Initialisation of the exports towards the growing lamina or sheath delta_leaf_enclosed_mstruct = delta_leaf_enclosed_Nstruct = delta_lamina_mstruct = delta_sheath_mstruct = delta_lamina_Nstruct = delta_sheath_Nstruct = leaf_export_sucrose = \ delta_internode_mstruct = delta_internode_Nstruct = leaf_export_amino_acids = leaf_remob_fructan = leaf_export_proteins = internode_export_sucrose = \ internode_export_amino_acids = internode_remob_fructan = internode_export_proteins = 0. # -- Delta Growth internode if hiddenzone_inputs['internode_pseudo_age'] < parameters.internode_rapid_growth_t: #: Internode is not yet in rapide growth stage TODO : tester sur une variable "is_ligulated" # delta mstruct of the internode ratio_mstruct_DM = model.calculate_ratio_mstruct_DM(hiddenzone_inputs['mstruct'], hiddenzone_inputs['sucrose'], hiddenzone_inputs['fructan'], hiddenzone_inputs['amino_acids'], hiddenzone_inputs['proteins']) delta_internode_enclosed_mstruct = model.calculate_delta_internode_enclosed_mstruct(hiddenzone_inputs['internode_L'], hiddenzone_inputs['delta_internode_L'], ratio_mstruct_DM) # delta Nstruct of the internode delta_internode_enclosed_Nstruct = model.calculate_delta_Nstruct(delta_internode_enclosed_mstruct) else: # delta mstruct of the enclosed internode delta_internode_enclosed_mstruct = model.calculate_delta_internode_enclosed_mstruct_postL(hiddenzone_inputs['delta_internode_pseudo_age'], hiddenzone_inputs['internode_pseudo_age'], hiddenzone_inputs['internode_L'], hiddenzone_inputs['internode_distance_to_emerge'], hiddenzone_inputs['internode_Lmax'], hiddenzone_inputs['LSIW'], hiddenzone_inputs['internode_enclosed_mstruct']) # delta Nstruct of the enclosed internode delta_internode_enclosed_Nstruct = model.calculate_delta_Nstruct(delta_internode_enclosed_mstruct) if hiddenzone_inputs['internode_is_visible']: #: Internode is visible visible_internode_id = hiddenzone_id + tuple(['internode', 'StemElement']) curr_visible_internode_inputs = all_elements_inputs[visible_internode_id] curr_visible_internode_outputs = all_elements_outputs[visible_internode_id] # Delta mstruct of the emerged internode delta_internode_mstruct = model.calculate_delta_emerged_tissue_mstruct(hiddenzone_inputs['LSIW'], curr_visible_internode_inputs['mstruct'], curr_visible_internode_inputs['length']) # Delta Nstruct of the emerged internode delta_internode_Nstruct = model.calculate_delta_Nstruct(delta_internode_mstruct) # Export of sucrose from hiddenzone towards emerged internode internode_export_sucrose = model.calculate_export(delta_internode_mstruct, hiddenzone_inputs['sucrose'], hiddenzone_inputs['mstruct']) # Export of amino acids from hiddenzone towards emerged internode internode_export_amino_acids = model.calculate_export(delta_internode_mstruct, hiddenzone_inputs['amino_acids'], hiddenzone_inputs['mstruct']) internode_remob_fructan = model.calculate_export(delta_internode_mstruct, hiddenzone_inputs['fructan'], hiddenzone_inputs['mstruct']) internode_export_proteins = model.calculate_export(delta_internode_mstruct, hiddenzone_inputs['proteins'], hiddenzone_inputs['mstruct']) # Update of internode outputs curr_visible_internode_outputs['mstruct'] += delta_internode_mstruct curr_visible_internode_outputs['max_mstruct'] = curr_visible_internode_outputs['mstruct'] curr_visible_internode_outputs['Nstruct'] += delta_internode_Nstruct curr_visible_internode_outputs['sucrose'] += internode_export_sucrose + internode_remob_fructan curr_visible_internode_outputs['amino_acids'] += internode_export_amino_acids curr_visible_internode_outputs['proteins'] += internode_export_proteins self.outputs['elements'][visible_internode_id] = curr_visible_internode_outputs # -- Delta Growth leaf if not hiddenzone_inputs['leaf_is_emerged']: #: Leaf is not emerged # delta mstruct of the hidden leaf ratio_mstruct_DM = model.calculate_ratio_mstruct_DM(hiddenzone_inputs['mstruct'], hiddenzone_inputs['sucrose'], hiddenzone_inputs['fructan'], hiddenzone_inputs['amino_acids'], hiddenzone_inputs['proteins']) delta_leaf_enclosed_mstruct = model.calculate_delta_leaf_enclosed_mstruct(hiddenzone_inputs['leaf_L'], hiddenzone_inputs['delta_leaf_L'], ratio_mstruct_DM) # delta Nstruct of the hidden leaf delta_leaf_enclosed_Nstruct = model.calculate_delta_Nstruct(delta_leaf_enclosed_mstruct) elif hiddenzone_inputs['leaf_is_growing']: #: Leaf has emerged and growing # delta mstruct of the enclosed leaf (which length is assumed to equal the length of the pseudostem) delta_leaf_enclosed_mstruct = model.calculate_delta_leaf_enclosed_mstruct_postE(hiddenzone_inputs['delta_leaf_pseudo_age'], hiddenzone_inputs['leaf_pseudo_age'], hiddenzone_inputs['leaf_pseudostem_length'], hiddenzone_inputs['leaf_enclosed_mstruct'], hiddenzone_inputs['LSSW']) # delta Nstruct of the enclosed en leaf delta_leaf_enclosed_Nstruct = model.calculate_delta_Nstruct(delta_leaf_enclosed_mstruct) # leaf has emerged and still growing visible_lamina_id = hiddenzone_id + tuple(['blade', 'LeafElement1']) #: Lamina is growing if all_elements_inputs[visible_lamina_id]['is_growing']: curr_visible_lamina_inputs = all_elements_inputs[visible_lamina_id] curr_visible_lamina_outputs = all_elements_outputs[visible_lamina_id] # Delta mstruct of the emerged lamina delta_lamina_mstruct = model.calculate_delta_emerged_tissue_mstruct(hiddenzone_inputs['SSLW'], curr_visible_lamina_inputs['mstruct'], curr_visible_lamina_inputs['green_area']) # Delta Nstruct of the emerged lamina delta_lamina_Nstruct = model.calculate_delta_Nstruct(delta_lamina_mstruct) # Export of metabolite from hiddenzone towards emerged lamina leaf_export_sucrose = model.calculate_export(delta_lamina_mstruct, hiddenzone_inputs['sucrose'], hiddenzone_inputs['mstruct']) leaf_export_amino_acids = model.calculate_export(delta_lamina_mstruct, hiddenzone_inputs['amino_acids'], hiddenzone_inputs['mstruct']) leaf_remob_fructan = model.calculate_export(delta_lamina_mstruct, hiddenzone_inputs['fructan'], hiddenzone_inputs['mstruct']) leaf_export_proteins = model.calculate_export(delta_lamina_mstruct, hiddenzone_inputs['proteins'], hiddenzone_inputs['mstruct']) # Cytokinins in the newly visible mstruct addition_cytokinins = model.calculate_init_cytokinins_emerged_tissue(delta_lamina_mstruct) # Update of lamina outputs curr_visible_lamina_outputs['mstruct'] += delta_lamina_mstruct curr_visible_lamina_outputs['max_mstruct'] = curr_visible_lamina_outputs['mstruct'] curr_visible_lamina_outputs['Nstruct'] += delta_lamina_Nstruct curr_visible_lamina_outputs['sucrose'] += leaf_export_sucrose + leaf_remob_fructan curr_visible_lamina_outputs['amino_acids'] += leaf_export_amino_acids curr_visible_lamina_outputs['proteins'] += leaf_export_proteins curr_visible_lamina_outputs['cytokinins'] += addition_cytokinins self.outputs['elements'][visible_lamina_id] = curr_visible_lamina_outputs else: #: Mature lamina, growing sheath # The hidden part of the sheath is only updated once, at the end of leaf elongation, by remobilisation from the hiddenzone visible_sheath_id = hiddenzone_id + tuple(['sheath', 'StemElement']) curr_visible_sheath_inputs = all_elements_inputs[visible_sheath_id] curr_visible_sheath_outputs = all_elements_outputs[visible_sheath_id] # Delta mstruct of the emerged sheath delta_sheath_mstruct = model.calculate_delta_emerged_tissue_mstruct(hiddenzone_inputs['LSSW'], curr_visible_sheath_inputs['mstruct'], curr_visible_sheath_inputs['length']) # Delta Nstruct of the emerged sheath delta_sheath_Nstruct = model.calculate_delta_Nstruct(delta_sheath_mstruct) # Export of metabolite from hiddenzone towards emerged sheath leaf_export_sucrose = model.calculate_export(delta_sheath_mstruct, hiddenzone_inputs['sucrose'], hiddenzone_inputs['mstruct']) leaf_export_amino_acids = model.calculate_export(delta_sheath_mstruct, hiddenzone_inputs['amino_acids'], hiddenzone_inputs['mstruct']) leaf_remob_fructan = model.calculate_export(delta_sheath_mstruct, hiddenzone_inputs['fructan'], hiddenzone_inputs['mstruct']) leaf_export_proteins = model.calculate_export(delta_sheath_mstruct, hiddenzone_inputs['proteins'], hiddenzone_inputs['mstruct']) addition_cytokinins = model.calculate_init_cytokinins_emerged_tissue(delta_sheath_mstruct) # Update of sheath outputs curr_visible_sheath_outputs['mstruct'] += delta_sheath_mstruct curr_visible_sheath_outputs['max_mstruct'] = curr_visible_sheath_outputs['mstruct'] curr_visible_sheath_outputs['Nstruct'] += delta_sheath_Nstruct curr_visible_sheath_outputs['sucrose'] += leaf_export_sucrose + leaf_remob_fructan curr_visible_sheath_outputs['amino_acids'] += leaf_export_amino_acids curr_visible_sheath_outputs['proteins'] += leaf_export_proteins curr_visible_sheath_outputs['cytokinins'] += addition_cytokinins self.outputs['elements'][visible_sheath_id] = curr_visible_sheath_outputs # -- CN consumption due to mstruct/Nstruct growth of the enclosed leaf and of the internode curr_hiddenzone_outputs['AA_consumption_mstruct'] = model.calculate_s_Nstruct_amino_acids((delta_leaf_enclosed_Nstruct + delta_internode_enclosed_Nstruct), delta_lamina_Nstruct, delta_sheath_Nstruct, delta_internode_Nstruct) #: Consumption of amino acids due to mstruct growth (µmol N) curr_hiddenzone_outputs['sucrose_consumption_mstruct'] = model.calculate_s_mstruct_sucrose((delta_leaf_enclosed_mstruct + delta_internode_enclosed_mstruct), delta_lamina_mstruct, delta_sheath_mstruct, curr_hiddenzone_outputs[ 'AA_consumption_mstruct']) #: Consumption of sucrose due to mstruct growth (µmol C) curr_hiddenzone_outputs['Respi_growth'] = RespirationModel.R_growth(curr_hiddenzone_outputs['sucrose_consumption_mstruct']) #: Respiration growth (µµmol C) # -- Update of hiddenzone outputs curr_hiddenzone_outputs['leaf_enclosed_mstruct'] += delta_leaf_enclosed_mstruct curr_hiddenzone_outputs['leaf_enclosed_Nstruct'] += delta_leaf_enclosed_Nstruct curr_hiddenzone_outputs['internode_enclosed_mstruct'] += delta_internode_enclosed_mstruct curr_hiddenzone_outputs['internode_enclosed_Nstruct'] += delta_internode_enclosed_Nstruct curr_hiddenzone_outputs['mstruct'] = curr_hiddenzone_outputs['leaf_enclosed_mstruct'] + curr_hiddenzone_outputs['internode_enclosed_mstruct'] curr_hiddenzone_outputs['Nstruct'] = curr_hiddenzone_outputs['leaf_enclosed_Nstruct'] + curr_hiddenzone_outputs['internode_enclosed_Nstruct'] curr_hiddenzone_outputs['sucrose'] -= ( curr_hiddenzone_outputs['sucrose_consumption_mstruct'] + curr_hiddenzone_outputs['Respi_growth'] + leaf_export_sucrose + internode_export_sucrose) curr_hiddenzone_outputs['fructan'] -= (leaf_remob_fructan + internode_remob_fructan) curr_hiddenzone_outputs['amino_acids'] -= (curr_hiddenzone_outputs['AA_consumption_mstruct'] + leaf_export_amino_acids + internode_export_amino_acids) curr_hiddenzone_outputs['proteins'] -= (leaf_export_proteins + internode_export_proteins) self.outputs['hiddenzone'][hiddenzone_id] = curr_hiddenzone_outputs # -- Remobilisation at the end of leaf elongation if hiddenzone_inputs['leaf_is_remobilizing']: share_leaf = curr_hiddenzone_outputs['leaf_enclosed_mstruct'] / curr_hiddenzone_outputs['mstruct'] # Case when the hiddenzone contains a hidden part of lamina if hiddenzone_inputs['leaf_pseudostem_length'] > hiddenzone_inputs['sheath_Lmax']: hidden_sheath_mstruct = model.calculate_sheath_mstruct(hiddenzone_inputs['sheath_Lmax'], hiddenzone_inputs['LSSW']) share_hidden_sheath = hidden_sheath_mstruct / curr_hiddenzone_outputs['leaf_enclosed_mstruct'] else: share_hidden_sheath = 1 # Add to hidden part of the sheath hidden_sheath_id = hiddenzone_id + tuple(['sheath', 'HiddenElement']) if hidden_sheath_id not in self.outputs['elements'].keys(): new_sheath_outputs = parameters.OrganInit().__dict__ self.outputs['elements'][hidden_sheath_id] = new_sheath_outputs curr_hidden_sheath_outputs = self.outputs['elements'][hidden_sheath_id] curr_hidden_sheath_outputs['mstruct'] = curr_hiddenzone_outputs['leaf_enclosed_mstruct'] * share_hidden_sheath curr_hidden_sheath_outputs['max_mstruct'] = curr_hiddenzone_outputs['leaf_enclosed_mstruct'] * share_hidden_sheath curr_hidden_sheath_outputs['Nstruct'] = curr_hiddenzone_outputs['leaf_enclosed_Nstruct'] * share_hidden_sheath curr_hidden_sheath_outputs['sucrose'] = curr_hiddenzone_outputs['sucrose'] * share_leaf * share_hidden_sheath curr_hidden_sheath_outputs['amino_acids'] = curr_hiddenzone_outputs['amino_acids'] * share_leaf * share_hidden_sheath curr_hidden_sheath_outputs['fructan'] = curr_hiddenzone_outputs['fructan'] * share_leaf * share_hidden_sheath curr_hidden_sheath_outputs['proteins'] = curr_hiddenzone_outputs['proteins'] * share_leaf * share_hidden_sheath self.outputs['elements'][hidden_sheath_id] = curr_hidden_sheath_outputs # Add to hidden part of the lamina, if any if share_hidden_sheath < 1: hidden_lamina_id = hiddenzone_id + tuple(['blade', 'HiddenElement']) curr_hidden_lamina_outputs = self.outputs['elements'][hidden_lamina_id] curr_hidden_lamina_outputs['mstruct'] = curr_hiddenzone_outputs['leaf_enclosed_mstruct'] * (1 - share_hidden_sheath) curr_hidden_lamina_outputs['max_mstruct'] = curr_hiddenzone_outputs['leaf_enclosed_mstruct'] * (1 - share_hidden_sheath) curr_hidden_lamina_outputs['Nstruct'] = curr_hiddenzone_outputs['leaf_enclosed_Nstruct'] * (1 - share_hidden_sheath) curr_hidden_lamina_outputs['sucrose'] = curr_hiddenzone_outputs['sucrose'] * share_leaf * (1 - share_hidden_sheath) curr_hidden_lamina_outputs['amino_acids'] = curr_hiddenzone_outputs['amino_acids'] * share_leaf * (1 - share_hidden_sheath) curr_hidden_lamina_outputs['fructan'] = curr_hiddenzone_outputs['fructan'] * share_leaf * (1 - share_hidden_sheath) curr_hidden_lamina_outputs['proteins'] = curr_hiddenzone_outputs['proteins'] * share_leaf * (1 - share_hidden_sheath) self.outputs['elements'][hidden_lamina_id] = curr_hidden_lamina_outputs # Remove in hiddenzone curr_hiddenzone_outputs = self.outputs['hiddenzone'][hiddenzone_id] curr_hiddenzone_outputs['leaf_enclosed_mstruct'] = 0 curr_hiddenzone_outputs['leaf_enclosed_Nstruct'] = 0 curr_hiddenzone_outputs['mstruct'] = curr_hiddenzone_outputs['internode_enclosed_mstruct'] curr_hiddenzone_outputs['Nstruct'] = curr_hiddenzone_outputs['internode_enclosed_Nstruct'] curr_hiddenzone_outputs['sucrose'] -= curr_hiddenzone_outputs['sucrose'] * share_leaf curr_hiddenzone_outputs['amino_acids'] -= curr_hiddenzone_outputs['amino_acids'] * share_leaf curr_hiddenzone_outputs['fructan'] -= curr_hiddenzone_outputs['fructan'] * share_leaf curr_hiddenzone_outputs['proteins'] -= curr_hiddenzone_outputs['proteins'] * share_leaf self.outputs['hiddenzone'][hiddenzone_id] = curr_hiddenzone_outputs # Turn remobilizing flag to False self.outputs['hiddenzone'][hiddenzone_id]['leaf_is_remobilizing'] = False # -- Remobilisation at the end of internode elongation # Internodes stop to elongate after leaves. We cannot test delta_internode_L > 0 for the cases of short internodes which are mature before GA production. if hiddenzone_inputs['internode_is_remobilizing']: # Add to hidden part of the internode hidden_internode_id = hiddenzone_id + tuple(['internode', 'HiddenElement']) if hidden_internode_id not in self.outputs['elements'].keys(): new_internode_outputs = parameters.OrganInit().__dict__ self.outputs['elements'][hidden_internode_id] = new_internode_outputs curr_hidden_internode_outputs = self.outputs['elements'][hidden_internode_id] curr_hidden_internode_outputs['mstruct'] += curr_hiddenzone_outputs['internode_enclosed_mstruct'] curr_hidden_internode_outputs['max_mstruct'] = curr_hidden_internode_outputs['mstruct'] curr_hidden_internode_outputs['Nstruct'] += curr_hiddenzone_outputs['internode_enclosed_Nstruct'] curr_hidden_internode_outputs['sucrose'] += curr_hiddenzone_outputs['sucrose'] curr_hidden_internode_outputs['amino_acids'] += curr_hiddenzone_outputs['amino_acids'] curr_hidden_internode_outputs['fructan'] += curr_hiddenzone_outputs['fructan'] curr_hidden_internode_outputs['proteins'] += curr_hiddenzone_outputs['proteins'] curr_hidden_internode_outputs['is_growing'] = False self.outputs['elements'][hidden_internode_id] = curr_hidden_internode_outputs # Turn remobilizing flag to False self.outputs['hiddenzone'][hiddenzone_id]['internode_is_remobilizing'] = False #: Turn the flag to true after remobilisation in order to Delete Hiddenzone in both MTG and shared_outputs self.outputs['hiddenzone'][hiddenzone_id]['is_over'] = True # -------------------------------- # -------------- Roots ----------- # -------------------------------- for root_id, root_inputs in all_roots_inputs.items(): curr_root_outputs = all_roots_outputs[root_id] axe_id = root_id[:2] curr_axis_outputs = all_axes_outputs[axe_id] # Temperature-compensated time (delta_teq) delta_teq = all_axes_inputs[axe_id]['delta_teq_roots'] # Growth mstruct_C_growth, mstruct_growth, Nstruct_growth, Nstruct_N_growth = model.calculate_roots_mstruct_growth(root_inputs['sucrose'], root_inputs['amino_acids'], root_inputs['mstruct'], delta_teq, postflowering_stages) # Respiration growth curr_root_outputs['Respi_growth'] = RespirationModel.R_growth(mstruct_C_growth) # Update of root outputs curr_root_outputs['mstruct'] += mstruct_growth curr_root_outputs['AA_consumption_mstruct'] = Nstruct_N_growth curr_root_outputs['sucrose_consumption_mstruct'] = model.calculate_roots_s_mstruct_sucrose(mstruct_growth, Nstruct_N_growth) curr_root_outputs['sucrose'] -= (curr_root_outputs['sucrose_consumption_mstruct'] + curr_root_outputs['Respi_growth']) curr_root_outputs['Nstruct'] += Nstruct_growth curr_root_outputs['amino_acids'] -= curr_root_outputs['AA_consumption_mstruct'] curr_root_outputs['delta_mstruct_growth'] = mstruct_growth self.outputs['roots'][root_id] = curr_root_outputs # Update of axis outputs self.outputs['axes'][axe_id] = curr_axis_outputs