Source code for pcse.crop.lintul_cassava10

# -*- coding: utf-8 -*-
# Herman Berghuijs (herman.berghuijs@wur.nl), Allard de Wit (allard.dewit@wur.nl), Tom Schut (tom.schut@wur.nl)
# February 2026

from pcse.base import SimulationObject, ParamTemplate, StatesTemplate, RatesTemplate
from pcse.crop.lintul_cassava.phenology import phenology
from pcse.crop.lintul_cassava.canopy_rain_interception import canopy_rain_interception
from pcse.crop.lintul_cassava.biomass_partitioning import biomass_partitioning
from pcse.crop.lintul_cassava.dormancy_and_recovery import dormancy_and_recovery
from pcse.crop.lintul_cassava.lintul_cassava_penman import penman
from pcse.crop.lintul_cassava.evapotranspiration import evapotranspiration
from pcse.crop.lintul_cassava.fibrous_root_growth import fibrous_root_growth
from pcse.crop.lintul_cassava.green_leaf_area import green_leaf_area
from pcse.crop.lintul_cassava.leaf_senescence import leaf_senescence
from pcse.crop.lintul_cassava.light_interception_and_growth import light_interception_and_growth
from pcse.crop.lintul_cassava.nutrient_dynamics import crop_nutrient_dynamics
from pcse.crop.lintul_cassava.nutrient_stress import npk_stress
from pcse.traitlets import Instance, Float

[docs] class LINTUL_CASSAVA(SimulationObject): """ Top level object organizing the different components of the LINTUL Cassava simulation. The CropSimulation object organizes the different processes of the crop simulation. Moreover, it contains the parameters, rate and state variables which are relevant at the level of the entire crop. The processes that are implemented as embedded simulation objects consist of: 1. Phenology (self.phenology) 2. Fibrous root growth (self.fibrous_root_growth) 3. Canopy rain interception (self.canopy_rain_interception) 4. Evapotranspiration (self.evapotranspiration) 5. NPK stress effects (self.npk_stress) 6. Dormancy and recovery (self.dormancy) 7. Leaf senescence (self.leaf_senescence) 8. Light interception and growth (self.light_interception_and_growth) 9. Biomass partitioning (self.biomass_partitioning) 10. Crop nutrient dynamics (self.crop_nutrient_dynamics) 11. Green leaf area dynamics (self.green_leaf_area) The LINTUL Cassava crop growth model in PCSE is a Python implementation of the LINTUL Cassava model (Ezui et al., 2018; Adiele et al., 2022) that was originally implemented in R. References: Adiele J.G., Schut A.G.T., Ezui K.S., Giller K.E. (2022) LINTUL-Cassava-NPK: A simulation model for nutrient-limited cassava growth. Field Crops Research 281: ARTN 108488. https://doi.org/10.1007/s13593-020-00649-w Ezui K.S., Leffelaar P.A., Franke A.C., Mando A., Giller K.E. (2018) Simulating drought impact and mitigation in cassava using the LINTUL model. Field Crops Research 219: 256-272. https://doi.org/10.1016/j.fcr.2018.01.033 """ phenology = Instance(SimulationObject) fibrous_root_growth = Instance(SimulationObject) penman = Instance(SimulationObject) canopy_rain_interception = Instance(SimulationObject) evapotranspiration = Instance(SimulationObject) npk_stress = Instance(SimulationObject) dormancy = Instance(SimulationObject) leaf_senescence = Instance(SimulationObject) light_interception_and_growth = Instance(SimulationObject) biomass_partitioning = Instance(SimulationObject) crop_nutrient_dynamics = Instance(SimulationObject) green_leaf_area = Instance(SimulationObject) class Parameters(ParamTemplate): pass class StateVariables(StatesTemplate): TAGP = Float() CTRAT = Float() CEVST = Float() class RateVariables(RatesTemplate): pass def initialize(self, day, kiosk, parvalues): self.kiosk = kiosk self.params = self.Parameters(parvalues) self.states = self.StateVariables(kiosk, TAGP=0.0, CTRAT=0.0, CEVST=0.0) self.rates = self.RateVariables(kiosk) self.phenology = phenology(day, kiosk, parvalues) self.fibrous_root_growth = fibrous_root_growth(day, kiosk, parvalues) self.canopy_rain_interception = canopy_rain_interception(day, kiosk, parvalues) self.evapotranspiration = evapotranspiration(day, kiosk, parvalues) self.npk_stress = npk_stress(day, kiosk, parvalues) self.dormancy = dormancy_and_recovery(day, kiosk, parvalues) self.leaf_senescence = leaf_senescence(day, kiosk, parvalues) self.light_interception_and_growth = light_interception_and_growth(day, kiosk, parvalues) self.biomass_partitioning = biomass_partitioning(day, kiosk, parvalues) self.crop_nutrient_dynamics = crop_nutrient_dynamics (day, kiosk, parvalues) self.green_leaf_area = green_leaf_area(day, kiosk, parvalues) def calc_rates(self, day, drv, delt = 1): self.phenology.calc_rates(day, drv, delt) self.fibrous_root_growth.calc_rates(day, drv, delt) self.canopy_rain_interception.calc_rates(day, drv, delt) self.evapotranspiration(day, drv) self.npk_stress(day, drv) self.dormancy.calc_rates(day, drv, delt) self.light_interception_and_growth.calc_rates(day, drv, delt) self.leaf_senescence.calc_rates(day, drv) self.biomass_partitioning.calc_rates(day, drv) self.crop_nutrient_dynamics.calc_rates(day, drv) self.green_leaf_area.calc_rates(day, drv) def integrate(self, day, delt = 1): self.phenology.integrate(day, delt) self.fibrous_root_growth.integrate(day, delt) self.canopy_rain_interception.integrate(day, delt) self.dormancy.integrate(day, delt) self.leaf_senescence.integrate(day, delt) self.light_interception_and_growth.integrate(day, delt) self.biomass_partitioning.integrate(day, delt) self.crop_nutrient_dynamics.integrate(day, delt) self.green_leaf_area.integrate(day, delt) k = self.kiosk s = self.states # Total above-ground biomass s.TAGP = k.WST + k.WLV + k.WSO # total crop transpiration and soil evaporation s.CTRAT += k.TRA * delt s.CEVST += k.EVS * delt
[docs] class LINTUL_CASSAVA_NO_NUTRIENT_STRESS(LINTUL_CASSAVA): """ Top level object organizing the different components of the LINTUL Cassava simulation, assuming non-nutrient limited conditions. This class inherits all functionality from the LINTUL_CASSAVA class, except that the class variable NUTRIENT_LIMITED is set to False to prevent nutrient stress. The CropSimulation object organizes the different processes of the crop simulation. Moreover, it contains the parameters, rate and state variables which are relevant at the level of the entire crop. The processes that are implemented as embedded simulation objects consist of: 1. Phenology (self.phenology) 2. Fibrous root growth (self.fibrous_root_growth) 3. Canopy rain interception (self.canopy_rain_interception) 4. Evapotranspiration (self.evapotranspiration) 5. NPK stress effects (self.npk_stress) 6. Dormancy and recovery (self.dormancy) 7. Leaf senescence (self.leaf_senescence) 8. Light interception and growth (self.light_interception_and_growth) 9. Biomass partitioning (self.biomass_partitioning) 10. Crop nutrient dynamics (self.crop_nutrient_dynamics) 11. Green leaf area dynamics (self.green_leaf_area) The LINTUL Cassava crop growth model in PCSE is a Python implementation of the LINTUL Cassava model (Ezui et al., 2018; Adiele et al., 2022) that was originally implemented in R. References: Adiele J.G., Schut A.G.T., Ezui K.S., Giller K.E. (2022) LINTUL-Cassava-NPK: A simulation model for nutrient-limited cassava growth. Field Crops Research 281: ARTN 108488. https://doi.org/10.1007/s13593-020-00649-w Ezui K.S., Leffelaar P.A., Franke A.C., Mando A., Giller K.E. (2018) Simulating drought impact and mitigation in cassava using the LINTUL model. Field Crops Research 219: 256-272. https://doi.org/10.1016/j.fcr.2018.01.033 """ def initialize(self, day, kiosk, parvalues): super().initialize(day, kiosk, parvalues) self.npk_stress.NUTRIENT_LIMITED = False
class LINTUL_CASSAVA_original(LINTUL_CASSAVA): """ Top level object organizing the different components of the LINTUL Cassava simulation, assuming non-nutrient limited conditions. This class inherits all functionality from the LINTUL_CASSAVA class, except for that it calculates the reference evapotranspiration rate with its native Penman method, instead of using the PCSE functionalities to calculate this. The CropSimulation object organizes the different processes of the crop simulation. Moreover, it contains the parameters, rate and state variables which are relevant at the level of the entire crop. The processes that are implemented as embedded simulation objects consist of: 1. Phenology (self.phenology) 2. Fibrous root growth (self.fibrous_root_growth) 3. Canopy rain interception (self.canopy_rain_interception) 4. Evapotranspiration (self.evapotranspiration) 5. NPK stress effects (self.npk_stress) 6. Dormancy and recovery (self.dormancy) 7. Leaf senescence (self.leaf_senescence) 8. Light interception and growth (self.light_interception_and_growth) 9. Biomass partitioning (self.biomass_partitioning) 10. Crop nutrient dynamics (self.crop_nutrient_dynamics) 11. Green leaf area dynamics (self.green_leaf_area) The LINTUL Cassava crop growth model in PCSE is a Python implementation of the LINTUL Cassava model (Ezui et al., 2018; Adiele et al., 2022) that was originally implemented in R. References: Adiele J.G., Schut A.G.T., Ezui K.S., Giller K.E. (2022) LINTUL-Cassava-NPK: A simulation model for nutrient-limited cassava growth. Field Crops Research 281: ARTN 108488. https://doi.org/10.1007/s13593-020-00649-w Ezui K.S., Leffelaar P.A., Franke A.C., Mando A., Giller K.E. (2018) Simulating drought impact and mitigation in cassava using the LINTUL model. Field Crops Research 219: 256-272. https://doi.org/10.1016/j.fcr.2018.01.033 """ def initialize(self, day, kiosk, parvalues): super().initialize(day, kiosk, parvalues) self.penman = penman(day, kiosk, parvalues) def calc_rates(self, day, drv, delt = 1): self.penman(day, drv) k = self.kiosk drv.ET0 = k.ET0 drv.ES0 = k.ES0 super().calc_rates(day, drv, delt = 1) class LINTUL_CASSAVA_original_NO_NUTRIENT_STRESS(LINTUL_CASSAVA_original): """ Top level object organizing the different components of the LINTUL Cassava simulation, assuming non-nutrient limited conditions. This class inherits all functionality from the LINTUL_CASSAVA class, except for that it calculates the reference evapotranspiration rate with its native Penman method, instead of using the PCSE functionalities to calcuate this and that it assumes no-nutrient limited conditions. The latter is obtained by setting the class variable NUTRIENT_LIMITED to false. The CropSimulation object organizes the different processes of the crop simulation. Moreover, it contains the parameters, rate and state variables which are relevant at the level of the entire crop. The processes that are implemented as embedded simulation objects consist of: 1. Phenology (self.phenology) 2. Fibrous root growth (self.fibrous_root_growth) 3. Canopy rain interception (self.canopy_rain_interception) 4. Evapotranspiration (self.evapotranspiration) 5. NPK stress effects (self.npk_stress) 6. Dormancy and recovery (self.dormancy) 7. Leaf senescence (self.leaf_senescence) 8. Light interception and growth (self.light_interception_and_growth) 9. Biomass partitioning (self.biomass_partitioning) 10. Crop nutrient dynamics (self.crop_nutrient_dynamics) 11. Green leaf area dynamics (self.green_leaf_area) The LINTUL Cassava crop growth model in PCSE is a Python implementation of the LINTUL Cassava model (Ezui et al., 2018; Adiele et al., 2022) that was originally implemented in R. References: Adiele J.G., Schut A.G.T., Ezui K.S., Giller K.E. (2022) LINTUL-Cassava-NPK: A simulation model for nutrient-limited cassava growth. Field Crops Research 281: ARTN 108488. https://doi.org/10.1007/s13593-020-00649-w Ezui K.S., Leffelaar P.A., Franke A.C., Mando A., Giller K.E. (2018) Simulating drought impact and mitigation in cassava using the LINTUL model. Field Crops Research 219: 256-272. https://doi.org/10.1016/j.fcr.2018.01.033 """ def initialize(self, day, kiosk, parvalues): super().initialize(day, kiosk, parvalues) self.npk_stress.NUTRIENT_LIMITED = False