Slurp
1 The APSIM Slurp Model
The model has been developed using the Plant Modelling Framework (PMF) of Brown et al., 2014. This new framework provides a library of plant organ and process submodels that can be coupled, at runtime, to construct a model in much the same way that models can be coupled to construct a simulation.This means that dynamic composition of lower level process and organ classes(e.g.photosynthesis, leaf) into larger constructions(e.g.maize, wheat, sorghum) can be achieved by the model developer without additional coding.
SLURP: the Sound of a crop using water
This model has been built using the Plant Modelling Framework (PMF) of Brown et al., 2014 to provide a simple representation of crops. It is usefull for water and nitrogen balance studies where the focus is on soil processes and a very simple crop is adequate. The model does not predict crop growth, development or yields. It simply takes up water and nitrogen. .
SLURP has no phenology so the behaviour of the SLURP is the same throughout its ontology (with the exception of root depth being able to increase). SLURP consists of 2 organs:
- Leaf which ls represented with a Simpleleaf class and provides a Water uptake demand to the soil arbitrator.
- Root which extracts water and nitrogen from the soil for plant growth
Inclusion in APSIM simulations
A Slurp crop is included in a simulation the same as any other APSIM crop
- The Slurp object needs to be dragged or copied from the Crop folder in the tool box into the field of your simulation.
- It is then planted with a sowing rule
Slurp.Sow(cultivar: StaticCrop, population: 1, depth: 10, rowSpacing: 150);
- Note that SLURP has no notion of population or rowSpacing but these parameters are required by the Sow method so filler values are provided
depthin the Sow arguement is the depth that the crop is sown at. While this has no effect on emergence in SLURP it sets the depth that the root system is initialised at. For static crops this depth should be set to the rooting depth that is expected as roots will not grow during the simulation
Altering Slurp properties during runs
In some cases users will wish to change properties of Slurp while the simulation is running. This can be done using a the set method in a manager script.
object LAIResetValue = leaflai;
zone.Set("Slurp.Leaf.LAIFunction.Value()", LAIResetValue);
object HeightResetValue = CoverToday * MaximumHeight;
zone.Set("Slurp.Leaf.HeightFunction.Value()", HeightResetValue);
The model is constructed from the following list of software components. Details of the implementation and model parameterisation are provided in the following sections.
1.1 Plant Model Components
| Component Name | Component Type |
|---|---|
| Phenology | Models.PMF.Phen.Phenology |
| Arbitrator | Models.PMF.OrganArbitrator |
| Root | Models.PMF.Organs.Root |
| Leaf | Models.PMF.Organs.SimpleLeaf |
| MortalityRate | Models.Functions.Constant |
| SeedMortalityRate | Models.Functions.Constant |
1.2 Cultivars
| Cultivar Name | Alternative Name(s) |
|---|---|
| StaticCrop | StaticCrop |
| StaticTree | StaticTree |
| Pasture | Pasture |
| Lucerne | Lucerne |
1.3 Child Components
1.3.1 Phenology
The phenological development is simulated as the progression through a series of developmental phases, each bound by distinct growth stage.
1.3.2 Arbitrator
The Arbitrator class determines the allocation of dry matter (DM) and Nitrogen between each of the organs in the crop model. Each organ can have up to three different pools of biomass:
- Structural biomass which is essential for growth and remains within the organ once it is allocated there.
- Metabolic biomass which generally remains within an organ but is able to be re allocated when the organ senesces and may be retranslocated when demand is high relative to supply.
- Storage biomass which is partitioned to organs when supply is high relative to demand and is available for retranslocation to other organs whenever supply from uptake, fixation, or re allocation is lower than demand.
The process followed for biomass arbitration is shown in the figure below. Arbitration calculations are triggered by a series of events (shown below) that are raised every day. For these calculations, at each step the Arbitrator exchange information with each organ, so the basic computations of demand and supply are done at the organ level, using their specific parameters.
- doPotentialPlantGrowth. When this event occurs, each organ class executes code to determine their potential growth, biomass supplies and demands. In addition to demands for structural, non structural and metabolic biomass (DM and N) each organ may have the following biomass supplies:
- Fixation supply. From photosynthesis (DM) or symbiotic fixation (N)
- Uptake supply. Typically uptake of N from the soil by the roots but could also be uptake by other organs (eg foliage application of N).
- Retranslocation supply. Storage biomass that may be moved from organs to meet demands of other organs.
- Reallocation supply. Biomass that can be moved from senescing organs to meet the demands of other organs.
- doPotentialPlantPartitioning. On this event the Arbitrator first executes the DoDMSetup() method to gather the DM supplies and demands from each organ, these values are computed at the organ level. It then executes the DoPotentialDMAllocation() method which works out how much biomass each organ would be allocated assuming N supply is not limiting and sends these allocations to the organs. Each organ then uses their potential DM allocation to determine their N demand (how much N is needed to produce that much DM) and the arbitrator calls DoNSetup() to gather the N supplies and demands from each organ and begin N arbitration. Firstly DoNReallocation() is called to redistribute N that the plant has available from senescing organs. After this step any unmet N demand is considered as plant demand for N uptake from the soil (N Uptake Demand).
- doNutrientArbitration. When this event occurs, the soil arbitrator gets the N uptake demands from each plant (where multiple plants are growing in competition) and their potential uptake from the soil and determines how much of their demand that the soil is able to provide. This value is then passed back to each plant instance as their Nuptake and doNUptakeAllocation() is called to distribute this N between organs.
- doActualPlantPartitioning. On this event the arbitrator call DoNRetranslocation() and DoNFixation() to satisfy any unmet N demands from these sources. Finally, DoActualDMAllocation is called where DM allocations to each organ are reduced if the N allocation is insufficient to achieve the organs minimum N concentration and final allocations are sent to organs.
1.3.3 Root
The root model calculates root growth in terms of rooting depth, biomass accumulation and subsequent root length density in each soil layer.
1.3.4 Leaf
This organ is simulated using a SimpleLeaf organ type. It provides the core functions of intercepting radiation, producing biomass through photosynthesis, and determining the plant's transpiration demand. The model also calculates the growth, senescence, and detachment of leaves. SimpleLeaf does not distinguish leaf cohorts by age or position in the canopy.
Radiation interception and transpiration demand are computed by the MicroClimate model. This model takes into account competition between different plants when more than one is present in the simulation. The values of canopy Cover, LAI, and plant Height (as defined below) are passed daily by SimpleLeaf to the MicroClimate model. MicroClimate uses an implementation of the Beer Lambert equation to compute light interception and the Penman Monteith equation to calculate potential evapotranspiration. These values are then given back to SimpleLeaf which uses them to calculate photosynthesis and soil water demand.
SimpleLeaf has two options to define the canopy: the user can either supply a function describing LAI or a function describing canopy cover directly. From either of these functions SimpleLeaf can obtain the other property using the Beer Lambert equation with the specified value of extinction coefficient. The effect of growth rate on transpiration is captured by the Fractional Growth Rate (FRGR) function, which is passed to the MicroClimate model.
1.3.5 MortalityRate
A constant function (name=value)
1.3.6 SeedMortalityRate
A constant function (name=value)
2 Interface
2.1 Slurp
Properties (Outputs)
| Name | Description | Units | Type | Settable? |
|---|---|---|---|---|
| Structure | IStructure | True | ||
| AboveGround | IBiomass | True | ||
| AboveGroundHarvestable | IBiomass | False | ||
| SowingData | SowingParameters | True | ||
| CultivarNames | String | False | ||
| SowingDate | datetime | True | ||
| Population | /m2 | double | True | |
| IsAlive | boolean | True | ||
| IsEmerged | boolean | False | ||
| IsReadyForHarvesting | boolean | False | ||
| DaysAfterSowing | d | int32 | False | |
| CoverGreen | - | double | False | |
| CoverTotal | - | double | False | |
| LAI | m2/m2 | double | False | |
| WaterUptake | double | False | ||
| NitrogenUptake | double | False |
Links (Dependencies)
| Name | Type | IsOptional? |
|---|---|---|
| summary | ISummary | False |
| clock | IClock | False |
| mortalityRate | IFunction | False |
| seedMortalityRate | IFunction | False |
| Phenology | Phenology | False |
| Arbitrator | IArbitrator | True |
| structure | Structure | True |
| Leaf | ICanopy | True |
| Root | IRoot | True |
Events published
| Name | Type |
|---|---|
| Sowing | Void Sowing (Object sender, EventArgs e) |
| PlantSowing | Void PlantSowing (Object sender, SowingParameters e) |
| Harvesting | Void Harvesting (Object sender, EventArgs e) |
| PostHarvesting | Void PostHarvesting (Object sender, HarvestingParameters e) |
| PlantEnding | Void PlantEnding (Object sender, EventArgs e) |
| Flowering | Void Flowering (Object sender, EventArgs e) |
| StartPodDevelopment | Void StartPodDevelopment (Object sender, EventArgs e) |
Methods (callable from manager)
| Name | Description |
|---|---|
| Sow | void Sow(String cultivar, double population, double depth, double rowSpacing, double maxCover, double budNumber, double rowConfig, double seeds, int32 tillering, double ftn)Sow the crop with the specified parameters. |
| Harvest | void Harvest(boolean removeBiomassFromOrgans)Harvest the crop. |
| EndCrop | void EndCrop() |
| ReducePopulation | void ReducePopulation(double newPlantPopulation)Reduce the plant population. |
| AddCultivar | void AddCultivar(Cultivar cultivar)Add a cultivar. |
2.2 SowingParameters
Parameters which control how a plant is sown.
Properties (Outputs)
| Name | Description | Units | Type | Settable? |
|---|---|---|---|---|
| Cultivar | String | True | ||
| Population | /m2 | double | True | |
| Seeds | double | True | ||
| Depth | mm | double | True | |
| RowSpacing | mm | double | True | |
| MaxCover | double | True | ||
| BudNumber | double | True | ||
| SkipType | double | True | ||
| SkipRow | double | True | ||
| SkipPlant | double | True | ||
| SkipDensityScale | double | True | ||
| TilleringMethod | int32 | True | ||
| FTN | double | True |
2.3 Phenology
The phenological development is simulated as the progression through a series of developmental phases, each bound by distinct growth stage.
Properties (Outputs)
| Name | Description | Units | Type | Settable? |
|---|---|---|---|---|
| Structure | IStructure | True | ||
| StageNames | String | False | ||
| StageCodes | int32 | False | ||
| AccumulatedTT | double | True | ||
| AccumulatedEmergedTT | double | True | ||
| Emerged | boolean | False | ||
| Stage | double | True | ||
| CurrentPhaseName | String | False | ||
| CurrentStageName | String | False | ||
| FractionInCurrentPhase | double | False | ||
| CurrentPhase | IPhase | False | ||
| Zadok | double | False |
Links (Dependencies)
| Name | Type | IsOptional? |
|---|---|---|
| plant | Plant | False |
| thermalTime | IFunction | False |
| zadok | ZadokPMFWheat | True |
| age | Age | True |
Events published
| Name | Type |
|---|---|
| PhaseChanged | Void PhaseChanged (Object sender, PhaseChangedType e) |
| StageWasReset | Void StageWasReset (Object sender, StageSetType e) |
| PlantEmerged | Void PlantEmerged (Object sender, EventArgs e) |
| PostPhenology | Void PostPhenology (Object sender, EventArgs e) |
Methods (callable from manager)
| Name | Description |
|---|---|
| IndexFromPhaseName | int32 IndexFromPhaseName(String name)Look for a particular phase and return it's index or -1 if not found. |
| StartStagePhaseIndex | int32 StartStagePhaseIndex(String stageName)Look for a particular stage and return it's index or -1 if not found. |
| EndStagePhaseIndex | int32 EndStagePhaseIndex(String stageName)Look for a particular stage and return it's index or -1 if not found. |
| SetToEndStage | void SetToEndStage() |
| SetToStage | void SetToStage(String newStage)A function that resets phenology to a specified stage |
| SetToStage | void SetToStage(double newStage)A function that resets phenology to a specified stage |
| SetAge | void SetAge(double newAge)Allows setting of age if phenology has an age child |
| OnStartDayOf | boolean OnStartDayOf(String stageName)A utility function to return true if the simulation is on the first day of the specified stage. |
| InPhase | boolean InPhase(String phaseName)A utility function to return true if the simulation is currently in the specified phase. |
| Between | boolean Between(int32 startPhaseIndex, int32 endPhaseIndex)A utility function to return true if the simulation is currently between the specified start and end stages. |
| Between | boolean Between(String start, String end)A utility function to return true if the simulation is currently between the specified start and end stages. |
| Beyond | boolean Beyond(String start)A utility function to return true if the simulation is at or past the specified startstage. |
| BeyondPhase | boolean BeyondPhase(int32 phaseIndex)A utility function to return true if the simulation is at or past the specified startstage. |
| BeforePhase | boolean BeforePhase(int32 phaseIndex)A utility function to return true if the simulation is before the specified phaseIndex. |
| PhaseStartingWith | IPhase PhaseStartingWith(String start)A utility function to return the phenological phase that starts with the specified start stage name. |
| PhaseBetweenStages | boolean PhaseBetweenStages(String startStage, String endStage, IPhase checkPhase)Helper function to check if a particular phase is present between specifice start and end stages. |
| ResetCampVernParams | void ResetCampVernParams(FinalLeafNumberSet overRideFLNParams)Resets the Vrn expression parameters for the CAMP model |
| OnCreated | void OnCreated() |
| SetEmergenceDate | void SetEmergenceDate(String emergenceDate)Force emergence on the date called if emergence has not occurred already |
| SetGerminationDate | void SetGerminationDate(String germinationDate)Force germination on the date called if germination has not occurred already |
| GetPhaseTable | DataTable GetPhaseTable() |
