More realistic non-linear photosynthesis
Open the file NLPS.gsz.
In this more realistic photosynthesis model, the rate of carbon fixation or carbon exchange is not directly linearly related to the light quantity but becomes saturated with increasing photosynthetic photon flux density:
where Rd = dark respiration [µmol m-2 s-1], PE = photosynthetic efficiency [-], Fmax = maximal net photosynthesis rate [µmol m-2 s-1], and CER also has the unit [µmol m-2 s-1].
We first declare the parameters of this model, they are all constants:
//parameters of the NLPS model: const float FMAX = 20.0; const float PHOTO_EFFICIENCY = 0.7; const float DARK_RESPIRATION_RATE = 0.5;
Next, a new method, calculateCER()
, is created, which calculates the carbon exchange rate as a function of absorbed light and the three parameters:
//method to calculate the Carbon Exchange Rate CER: float calculateCER(float ppfd) { return (float) ((FMAX + DARK_RESPIRATION_RATE)*PHOTO_EFFICIENCY*ppfd) /(PHOTO_EFFICIENCY*ppfd + FMAX + DARK_RESPIRATION_RATE) - DARK_RESPIRATION_RATE; }
This means the method calculateCER
requires as input the quantity of absorbed light.
In order to obtain the actual amount of assimilates produced by any leaf with a certain area and during a certain period, we need another method, calculatePS()
:
//method to calculate the actual amount of assimilates produced by any leaf: float calculatePS(float a, float ppfd, float d) { return calculateCER(ppfd) * a * d * 44.01e-6 *(180.162/264.06) /1000.0; }
This method invokes the method calculateCER
and multiplies it with the leaf area and a duration in time, which will be defined below, and with a number of other conversion coefficients to get the biomass in kg glucose equivalents.
You have noticed that the leaves used in this model are rectangles. However, the surface of a leaf is not equal to the product of its length and diameter but only about 65 to 70% of this. Thus, we needed to introduce a coefficient, which reduces the leaf area accordingly. This is also called a form factor:
//form factor const float LEAF_FF = 0.6;
The amount of absorbed light is already expressed as a photon flux density; we had done the conversion earlier on. For the duration, we assume a day length of 8 hours, thus 8*60*60 seconds:
//duration: const float DURATION = 8 * 60 * 60;
The method absorbAndGrow()
is now modified accordingly. In lf[as]
we are going to store the actual cumulated amount of assimilates by invoking the calculatePS()
method. Note that we are using a graph/data table lightresponse, in which we plot lf[al]
against the result of the invocation of the calculateCER()
method, with lf[al]
as input (L. 154) (to do so, we have created a new variable cer
in L. 153):
lf:Leaf ::> { lf[al] = lm.getAbsorbedPower3d(lf).integrate()*2.25*10; lf.(setShader(new AlgorithmSwitchShader(new RGBAShader(lf[al]*0.005, lf[al]*0.05, lf[al]*0.001),GREEN))); lf[age]++; // functions to calculate leaf ps: float area = LEAF_FF*lf[length]*lf[width]/10000; lf[as] += calculatePS(area,lf[al]/area,DURATION); float cer = calculateCER(lf[al]); lightresponse.addRow().set(0,lf[al],cer); lf[length] += logistic(2, lf[age], 10, 0.5); lf[width] = lf[length]*0.7; }
Run the model. Change the form factor of the leaves to 0.9 to see if this has an effect! Do the same with the parameters of the lamp and the PS model.