====== Assimilate Transport and Fruit Development ======
//Open {{ :tutorials:advanced:Transport.gsz |Transport.gsz}}//
The Transport model extends the [[:Tutorials:Radiation-model-in-crop model7|Flower aging model]] by implementing a physiologically-based system for sugar transport from photosynthetically active leaves through the plant architecture to developing fruits. This creates a more realistic simulation of source-sink relationships in the virtual plant.
===== Assimilate Storage and Transport Parameters =====
The model introduces a new parameter ''as'' (assimilate storage) to track sugar content in different organs (L. 9, 12, 43):
module Internode(super.length, int age, int rank, float as) extends Cylinder(length, 0.1);
module Leaf(super.length, super.width, float al, int age, float as, int rank) extends Box(length, width, 0.01);
module Fruit(float size, int age, float as) ==> Sphere(size).(setShader(RED));
Note that we now track assimilates (''as'') in three types of modules: leaves (where they are produced), internodes (where they are transported), and fruits (where they accumulate).
===== Maintenance Respiration =====
A maintenance respiration constant has been added to simulate the metabolic cost of keeping tissues alive (L. 96):
const float MR = 0.01; //maintenance respiration
This is applied to internodes during growth to simulate sugar consumption (L. 207 ff):
itn:Internode ::> {
itn[age]++;
if(itn[as]>0) {itn[as] *= (1-MR); }
itn[length] += logistic(1, itn[age], 10, itn[as]);
itn.(setShader(new RGBAShader(itn[as]*15.0, itn[as]*7.5, itn[as])));
}
Note that internode length is incremented up to a fixed length of 1, however, we vary the speed of elongation as a function of sugar available in the internode, ''itn[as]''.
===== Transport Mechanism =====
The main novelty of the present model is the implementation of a diffusion-based transport system. The transport occurs with a diffusion constant that controls the rate (L. 94):
const float DIFF_CONST = 0.002;
Transport is invoked periodically in the ''grow()'' method - every 24 timesteps to simulate hourly transport (L. 145-149):
if(time % 24 == 0) {
for(int hour = 0; hour < 24; hour++) {
transport();
}
}
===== Transport Rules =====
Three types of transport are implemented using user-defined edge relations:
**a) Leaf to Internode Transport, and vice versa ** (L. 256-280):
lf:Leaf <-minDescendants- itn:Internode ::> {
if(lf[as] > 0.01 && lf[age]>=10) { // Keep minimum for leaf maintenance
float exportable = lf[as] - 0.01;
float r = DIFF_CONST * exportable;
lf[as] -= r;
itn[as] += r;
//println("transport from leaf to internode");
} else
if(itn[as] > 0.01 && lf[age]<10) { // Keep minimum for internode maintenance
float exportable = itn[as] - 0.01;
float r = DIFF_CONST * exportable;
lf[as] += r;
itn[as] -= r;
//println("transport from internode to leaf");
}
}
This rule ensures leaves retain a minimum amount (0.01) for maintenance while exporting the surplus. In fact, if you look closely, assimilates can also go the other way, from an internode to a (young) leaf, because the latter is a sugar sink before it has reached its final size and becomes a net exporter of assimilates!
**b) Internode to Internode Transport** (L. 260-268):
i_top:Internode <-minDescendants- i_bottom:Internode ::> {
if((i_bottom[as] - i_top[as])<=0) {
float r = DIFF_CONST * (i_top[as] - i_bottom[as]);
i_bottom[as] :+= r;
i_top[as] :-= r;
}
else if ((i_bottom[as] - i_top[as])>0) {
float r = DIFF_CONST * (i_bottom[as] - i_top[as]);
i_bottom[as] :-= r;
i_top[as] :+= r;
}
}
This bidirectional transport follows the concentration gradient between successive internodes.
**c) Internode to Fruit Transport** (L. 269-275):
itn:Internode -minDescendants-> fr:Fruit ::> {
if(itn[as]>0) {
float r = DIFF_CONST * itn[as];
itn[as] :-= r;
fr[as] :+= r;
println("sugar import into fruit: " + r);
}
}
This final rule expresses transport in only one direction, i.e. fruits are //absolute sinks// (which is wrong, because young fruit are often green and have been shown to carry out photosynthesis).
===== Fruit Set Decision Based on Sugar Availability =====
The model now makes fruit formation dependent on sugar available in the nearest leaf (L. 169-174):
fl:Flower(t, m), (t >= m && t
{float sugar = first((* Leaf *)[as]);
println("sugar: " + sugar);
}
if(sugar>0.0005) ({noFrts++;} Fruit(0.01,1,0.1,noFrts))
else (fl);
Note that a ''Flower'' that has not yet become a ''Fruit'', has two more chances to become one.
Availability of sugar is calculated by querying ''as'' of the nearest ''Leaf'' before deciding on fruit formation.
===== Fruit Growth Competition =====
Multiple fruits compete for available resources using an age-based weighting system (L. 214-226):
fr:Fruit ::> {
float totalSugar = sum((* lf1:Leaf *)[as]);
long fruitCount = count((* fr2:Fruit *));
// Simple age-based competition (younger fruits get more resources)
float ageWeight = Math.exp(-0.05 * fr[age]);
float totalAgeWeight = 0;
for ((* fr2:Fruit *)) {
totalAgeWeight += Math.exp(-0.05 * fr2[age]);
}
float sugar = (totalAgeWeight > 0) ?
(totalSugar * ageWeight) / totalAgeWeight : totalSugar / fruitCount;
Younger fruits receive proportionally more resources through exponential age weighting, simulating their stronger sink affinity (thereby compensating their smaller size).
===== Visual Feedback =====
Internodes change color based on their sugar content, providing visual feedback of the transport process:
itn.(setShader(new RGBAShader(itn[as]*2000.0, itn[as]*1000, itn[as])));
===== Tasks for Exploration =====
- Run the model and observe sugar flow: Watch how internodes change color as sugar moves through them.
- Modify DIFF_CONST: Try values between 0.0001 and 0.01. How does this affect:
* Speed of sugar movement?
* Final fruit size?
* Number of successfully developed fruits?
- Change transport frequency: Modify the condition if(time % 24 == 0) to different values (e.g., % 12 for twice-daily transport). What impact does this have?
- Adjust maintenance respiration: Change MR from 0.01 to 0.05. How does increased respiration affect fruit development?
===== Biological Relevance =====
This transport model introduces key physiological concepts:
• Source-sink relationships: Leaves act as sources, fruits as sinks
• Phloem transport: Simplified as diffusion along concentration gradients
• Competition for resources: Multiple sinks compete for limited assimilates
• Maintenance respiration: Realistic metabolic costs
• Sink strength: Younger fruits have stronger sink strength