Class AstronomicParametersTransformer
- All Implemented Interfaces:
net.simplace.sim.util.FWSimFieldContainer
Calculated daylength, photoperiodic daylength, solar constant and daily total effective solar height for each DOY for a set of given latitudes.
Input and output of the transformer
For each row in the resource it creates 366 rows containing values for each day of year (DOY)
The transformer needs the field names of a resource, that contain
- location id
- latitude in decimal degrees
- inclination of sun angle in decimal degrees
Normally you do not enter the numeric value for latitude, but a reference to the value, i. e. the column name of the resource's column containing the latitudes.
It outputs a resource with following fields
- DOY (serves as a key) (INT)
- location id (serves as a key, same as the key of the resource)
- daylength (DOUBLE)
- photoperiodic daylength (DOUBLE)
- solar constant (DOUBLE)
- seasonal offset of sine of solar height (DOUBLE)
- amplitude of sine of solar height (DOUBLE)
- daily integral of SINB over the day (DOUBLE)
- daily integral of corrected SINB for lower atmospheric transmission at lower solar elevation (DOUBLE)
- area under the sinBeta curve (DOUBLE)
Example
First you need a resource that has a latitude and sun inclination column.
| <resource id="locations" interface="locationsfile" frequence="COMPLEX" rule="${DefaultManagement.DoSow}">
| <header>
| <res id="LocationId" datatype="CHAR" key="vActualLocation" />
| <res id="Altitude" datatype="DOUBLE" />
| <res id="Latitude" datatype="DOUBLE" />
| <res id="SunInclination" datatype="DOUBLE" />
| <res id="SoilType" description="" datatype="CHAR" />
| </header>
| </resource>
Now the resource id="locations" has to be written into the transformers resource attribute.
The header section contains the outputs of the tranformer. Make sure that they are in the same order as in the example. Dont't forget to add to the second element (LocationId) the same key attribute as in the resource.
Finally you tell the transformer the name of the resources id field (LocationId) and the name of the fields that hold the latitude and sun inclination.
Remember: the names have to match exactly, lower and upper case matters!
| <transform id="at" frequence="DAILY" resource="locations" class="net.simplace.sim.transformers.AstronomicParametersTransformer"> | <header> | <res id="DOY" datatype="INT" key="CURRENT.DOY" /> | <res id="LocationId" datatype="CHAR" key="vActualLocation" /> | <res id="DayLength" datatype="DOUBLE" /> | <res id="PhotoperiodicDayLength" datatype="DOUBLE" /> | <res id="SolarConstant" datatype="DOUBLE" /> | <res id="SINLD" datatype="DOUBLE" /> | <res id="COSLD" datatype="DOUBLE" /> | <res id="DSINB" datatype="DOUBLE" /> | <res id="DSINBE" datatype="DOUBLE" /> | </header> | <input id="SunInclinationField">SunInclination</input> | <input id="LatitudeField">Latitude</input> | <input id="IdField">LocationId</input> | </transform>
Remarks
The calculation method follows mainly the routine from the Gecros model (1), see also (2) and (3):
Differences between this routine and Gecros
- Gecros limits the latitude between -67 and 67 degrees. This routine extends the range from -90 to 90 degrees as in Lintul5 (2)
- Sine and Cosine of declination are calculated directly (in a mathematical equivalent way)
- Values are calculated with double precision, which might result in slightly different values than from the FORTRAN code.
Formulas
Conversion factor from degrees to radians. The original Fortran/FST-Modules use a less precise approximation of \(\pi \approx 3.141592654\), whereas here \(\pi \approx 3.141592653589793\). \[ \begin{eqnarray} rad & = & \frac{\pi}{180}\\ \end{eqnarray} \] Sine and cosine of latitude, maximal declination. Values calculated only once per location. \[ \begin{eqnarray} sinlat & = & \sin(rad \cdot latitutde)\\ coslat & = & \cos(rad \cdot latitutde)\\ sindcm & = & \sin(rad \cdot 23.45)\\ \end{eqnarray} \] Sine and cosine of declination of the sun as function of day of year. Calculation is taken from Goudriaan, van Laar 1994. Some models first calculate \(dec\) as the arcsine of \(sindec\) and then take the sine and cosine. The methods are mathematically equivalent due to \(sin^2+cos^2=1\) \[ \begin{eqnarray} sindec & = & -sindcm \cos(2 \pi \frac{doy+10}{365})\\ cosdec & = & \sqrt{1-sindec^2}\\ sinld & = & sinlat \cdot sindec\\ cosld & = & coslat \cdot cosdec \end{eqnarray} \] Daylength calculation. \[ \begin{eqnarray} arg & = & \min(1,\max(-1,\frac{sinld}{cosld}))\\ daylength & = & 12 (1 + \frac{2}{\pi} \arcsin(arg))\\ \end{eqnarray} \] Photoperiodic daylength \[ \begin{eqnarray} arg2 & = & \min(1,\max(-1,\frac{-\sin(rad \cdot inclination)+sinld}{cosld}))\\ ddlp & = & 12(1+\frac{2}{\pi}\arcsin(arg2))\\ \end{eqnarray} \] Solar constant \[ \begin{eqnarray} sc & = & 1367(1 + 0.033 \cos(2 \pi\frac{doy-10}{365}))\\ \end{eqnarray} \] Daily total of effective solar height \[ \begin{eqnarray} dsinb & = & 3600(dayl \cdot sinld+24 cosld \frac{\sqrt{1-arg^2}}{\pi})\\ dsinbe & = & 3600(dayl(sinld+0.4(sinld^2+\frac{cosld^2}{2})) + 12 cosld(2+3\cdot 0.4 sinld)\frac{\sqrt{1-arg^2}}{\pi}) \end{eqnarray} \] Notice: The sine of solar height is \(sin\beta(h) = sinld + cosld \cdot \cos(2 \pi \frac{h-12}{24})\), \(dsinb\) is the integral \(\int_0^{24} sin\beta(h)dh\) converted to seconds.Utilisation
Transformer is used in the FST based models:
Notice
Transformer works only with resources that have a single column key (that identifies the location) The transformed resource has two keys: the DOY and the key from the resource.
Tweaks
Instead of transforming a resource, the transformer can get the values for latitude and inclination directly and generate day lengths etc.
In order to use the transformer this way, you have to omit the resource attribute. LatitudeField and SunInclinationField should then reference the coresponding DOUBLE variables.
| <var id="vActualLocation" datatype="CHAR">sevilla</var> | <var id="vLatitude" datatype="DOUBLE">53.1</var> | <var id="vSunInclination" datatype="DOUBLE">-2.5</var> | ... | <transform id="at" frequence="DAILY" resource="locations" class="net.simplace.sim.transformers.AstronomicParametersTransformer"> | <header> | <res id="DOY" datatype="INT" key="CURRENT.DOY" /> | <res id="LocationId" datatype="CHAR" key="vActualLocation" /> | <res id="DayLength" datatype="DOUBLE" /> | ... | </header> | <input id="SunInclinationField">vSunInclination</input> | <input id="LatitudeField">vLatitude</input> | <input id="IdField">vActualLocation</input> | </transform>
It's recommended to use the transformer with a resource, rather than the tweaked method. You can't mix the two methods by taking one value from the resource and another directly. The way of configuring the tweaked method might change (especially the ids of the inputs might be renamed to distinguish them from the inputs of the standart method).
References
- (1) YIN, X. and van Laar, H. H., Crop Systems Dynamics, 2005
- (2) Wolf, J., User guide for Lintul 5, 2012 https://models.pps.wur.nl/system/files/LINTUL5-report-vs1_0.zip
- (3) Goudriaan, Modeling Potential Crop Growth Processes, 1994, (revised version Nov. 2004)
- Author:
- Gunther Krauss, Andreas Enders
Component Variables
| Content Type | Name | Description | Data Type | Unit | Min Value | Max Value | Default Value |
|---|---|---|---|---|---|---|---|
| constant | IdField | Field name / column name of the resource containing the ids / key variables | CHAR | - | - | ||
| constant | LatitudeField | Field name / column name of the resource containing the latitude | CHAR | - | - | ||
| constant | SunInclinationField | Field name / column name of the resource containing the sun inclination | CHAR | - | - |
-
Nested Class Summary
Nested classes/interfaces inherited from class net.simplace.sim.io.FWSimIOAdapter
net.simplace.sim.io.FWSimIOAdapter.FREQUENCE -
Field Summary
Fields inherited from class net.simplace.sim.io.resources.FWSimResourceTransformer
iFieldMap, iIntColumnMap, iLastInputValuesMap, iLastProjectID, iLastUniqueID, iPoolName, iSourceNameFields inherited from class net.simplace.sim.io.resources.FWSimInputAdapter
iJexlScript, iShouldCacheToDBFields inherited from class net.simplace.sim.io.FWSimIOAdapter
iArrayMode, iFieldcount, iFrequence, iHeaderVariables, iInterface, iJexlRule, iKeyMap, iName, iOrderNumber, iProcessTime, iResourceElement, iSession, iSourceKey -
Constructor Summary
ConstructorsConstructorDescriptionused for ClassForNameAstronomicParametersTransformer(net.simplace.sim.FWSimSession aSession, Integer aOrderNumber) AstronomicParametersTransformer(net.simplace.sim.FWSimSession aSession, org.jdom2.Element aResourceElement, Integer aOrderNumber) -
Method Summary
Modifier and TypeMethodDescriptionnet.simplace.sim.io.resources.FWSimResourceCachecalculateDaylength(net.simplace.sim.util.FWSimVariable<String> aIdname, net.simplace.sim.util.FWSimVariable<String> aLatitudename, net.simplace.sim.util.FWSimVariable<String> aInclinationname, net.simplace.sim.io.resources.FWSimResourceCache aCache, net.simplace.sim.util.FWSimVarMap aVarMap) Calculates Daylengthsnet.simplace.sim.io.resources.FWSimResourceCachegetData(net.simplace.sim.util.FWSimVarMap aVarMap) standard method from outsidenet.simplace.sim.io.resources.FWSimResourceCachegetData(net.simplace.sim.util.FWSimVarMap aVarMap, net.simplace.sim.io.resources.FWSimResourceCache aResourceCache) used by test casesvoidupdateFields(net.simplace.core.FWObservable aObservable) Methods inherited from class net.simplace.sim.io.resources.FWSimResourceTransformer
addVariable, createFormFields, createResourceTransformer, createResourceTransformer, createResourceTransformer, createSimTransformer, fillVarMap, getCreateFormXML, getEditFormXML, getSourceResourceCache, getVariable, isUpdated, toDocXML, toXMLMethods inherited from class net.simplace.sim.io.resources.FWSimInputAdapter
getContentType, getInputVariables, getJexlScript, getOutputVariables, getVarMap, isTransformer, shouldCacheToDB, toHTMLTablestringMethods inherited from class net.simplace.sim.io.FWSimIOAdapter
addProcessTime, checkCondition, createFormFields, finalize, getFieldMap, getFrequence, getHeaderVariables, getHeaderXML, getInterface, getJexlRule, getKeyMap, getName, getOrderNumber, isArrayMode, isConditionCheck, removeVariable, setInterface, setOrderNumber, toString, writeHeaderList
-
Constructor Details
-
AstronomicParametersTransformer
public AstronomicParametersTransformer(net.simplace.sim.FWSimSession aSession, org.jdom2.Element aResourceElement, Integer aOrderNumber) - Parameters:
aSession-aResourceElement-aOrderNumber-
-
AstronomicParametersTransformer
public AstronomicParametersTransformer(net.simplace.sim.FWSimSession aSession, Integer aOrderNumber) - Parameters:
aSession-aOrderNumber-
-
AstronomicParametersTransformer
public AstronomicParametersTransformer()used for ClassForName
-
-
Method Details
-
createVariables
- Specified by:
createVariablesin interfacenet.simplace.sim.util.FWSimFieldContainer- Overrides:
createVariablesin classnet.simplace.sim.io.FWSimIOAdapter
-
getData
public net.simplace.sim.io.resources.FWSimResourceCache getData(net.simplace.sim.util.FWSimVarMap aVarMap) throws net.simplace.sim.exceptions.MissingSimResourceException standard method from outside- Specified by:
getDatain classnet.simplace.sim.io.resources.FWSimInputAdapter- Throws:
net.simplace.sim.exceptions.MissingSimResourceException- See Also:
-
getData
public net.simplace.sim.io.resources.FWSimResourceCache getData(net.simplace.sim.util.FWSimVarMap aVarMap, net.simplace.sim.io.resources.FWSimResourceCache aResourceCache) throws net.simplace.sim.exceptions.MissingSimResourceException used by test cases- Parameters:
aVarMap- variable mapaResourceCache- Cached resources (soil data)- Returns:
- delivered new data from transformer
- Throws:
net.simplace.sim.exceptions.MissingSimResourceException
-
calculateDaylength
public net.simplace.sim.io.resources.FWSimResourceCache calculateDaylength(net.simplace.sim.util.FWSimVariable<String> aIdname, net.simplace.sim.util.FWSimVariable<String> aLatitudename, net.simplace.sim.util.FWSimVariable<String> aInclinationname, net.simplace.sim.io.resources.FWSimResourceCache aCache, net.simplace.sim.util.FWSimVarMap aVarMap) throws net.simplace.sim.exceptions.MissingSimResourceException Calculates Daylengths- Parameters:
aIdname-aLatitudename-aInclinationname-aCache- original soil info storedaVarMap-- Returns:
- the new created
FWSimResourceCache - Throws:
net.simplace.sim.exceptions.MissingSimResourceException
-
updateFields
public void updateFields(net.simplace.core.FWObservable aObservable) - Specified by:
updateFieldsin classnet.simplace.sim.io.resources.FWSimResourceTransformer- See Also:
-