CoAgMET Crop ET Coefficients
We have 3 slightly different ways of calculating crop coefficients for calculate Evapotranspiration (ET) of those crops:
- The main algorithm that calculates daily crop coefficients with a polynomial expression
- Cool season turf, and
- A table of coefficients, one per day.
We also have presentation slides and data files from two evapotranspiration workshops we held: Using the Best Science to Estimate Consumptive Use (2010) and New Technologies and Methods for Estimating ET (2012).
Main Polynomial-Based Algorithm
This is the algorithm we use for our main set of crops: alfalfa, corn, drybeans, grass hay, small greens, sugar beets, potatoes, onions and winter wheat.
Main Crop ET Algorithm
Input:
⇒ ETr array, ET values calculated for each day
Output:
⇒ Crop_ET array, one entry per day
From the crop ET data file load:
⇒ Coefficients array with coefficients for stages 2 and 3
⇒ Limits array with limits for stages 2 and 3
⇒ planting_date for the crop
⇒ Thresholds array with stage switch thresholds
Pseudocode:
# Initialize
let today = day of year from system
let stage = 1
let etr_sum = 0
let threshold = Thresholds[1]
let c0, c1, c2, c3 = 0
let kmin, kmax = Limits[1]
let day_of_year = planting_date
while day_of_year <= today do
let etr = ETr[day_of_year]
etr_sum = etr_sum + etr
if etr_sum > threshold and stage < 3 then # switch to next stage
etr_sum = etr
stage = stage + 1
threshold = Thresholds[stage]
c0...c3 = Coefficients[stage]
kmin, kmax = Limits[stage]
end if
let k = 0
if stage == 1 then # always use minimum k for stage 1
k = kmin
else
if threshold == 0 then
k = c0
else
let frac_sum = etr_sum / threshold * 100
# Polynomial expression
k = c0 + c1 * frac_sum + c2 * frac_sum2 + c3 * frac_sum3
end if
# clamp k within bounds
if k < kmin then
k = kmin
else if k > kmax then
k = kmax
end if
end if
Crop_ET[day_of_year] = k * etr # output
day_of_year = day_of_year + 1
end while
Where array access syntax is array[index]
Crop ET Data File
The data file with the constants for running the polynomial algorithm has the several crops listed one after another, separated by a comment character (#). Each line has values in a specific format as in the table below:
| Line | Contents |
|---|---|
| 1 | crop name |
| 2 | stage 2 coeffs C0 to C3 |
| 3 | stage 3 coeffs C0 to C3 |
| 4 | stage 2 K min and max, stage 3 K min and max |
| 5 | Planting date (mm,dd) |
| 6 | Stage sum thresholds (3) |
The crop coefficients used to generate crop ET reports were developed for the Penman-Kimberly model.
{{.Crop}}
{{range .Coeffs}}
{{.}}
{{- end -}}
Error reading crop constants file
{{- end -}}Cool Season Turf
Turf calculates the crop coefficient k with linear interpolation. Before March 15, k is 0.35. From Mar 15 to May 15, k is linearly interpolated between 0.35 and 0.81. From May 15 to September 15, k is 0.81. After September 15 and before November 15, k is linearly interpolated between 0.81 and 0.35. From November 15 on, k is 0.35. For the final crop ET calculation, a correction factor of 0.835 is applied to ETr.
Turf ET Algorithm
Input:
⇒ ETr array, ET values calculated for each day
Output:
⇒ Crop_ET array, one entry per day
From the coefficient tables file load:
⇒ Coefficients array with coefficients for stages 2 and 3
⇒ Limits array with limits for stages 2 and 3
⇒ planting_date for the crop
⇒ Thresholds array with stage switch thresholds
Pseudocode:
let today = day of year from system
let k1 = 0.35, k2 = 0.81
let mar15 = 75, may15 = 136, sep15 = 258, nov15 = 319
let day_of_year = 1
while day_of_year <= today do
let k = k1
if day_of_year > mar15 and day_of_year < may15 then
k = k1 + (k2 - k1) * (day_of_year - mar15) / (may15 - mar15)
else if day_of_year >= may15 and day_of_year <= sep15 then
k = k2
else if day_of_year > sep15 and day_of_year < nov15 then
k = k2 + (k1 - k2) * (day_of_year - sep15) / (nov15 - sep15)
end if
Crop_ET[day_of_year] = k * ETr[day_of_year] * 0.835
day_of_year = day_of_year + 1
end while
Where array access syntax is array[index]
Table of Coefficients Algorithm
This code is as basic as you can get. ETo values will have already been calculated, and daily coefficients ready from the data file. For each day the ETo and crop coefficient (k) values are looked up in their respective arrays, ETo is multiplied by k, and that is stored in the output array. Note that unlike the other coefficients, these are meant to be used with ETo, not ETr.
Coefficient Table Algorithm
Input:
⇒ ETo array, ET values calculated for each day
Output:
⇒ Crop_ET array, one entry per day
From the coefficient tables file load:
⇒ Green_Up_Date for the crop
⇒ Coefficients array of daily coefficients
Pseudocode:
# Initialize
let today = day of year from system
let day_of_year = Green_Up_Date
while day_of_year <= today do
let eto = ETo[day_of_year]
let k = Coefficients[day_of_year]
Crop_ET[day_of_year] = k * eto # output
day_of_year = day_of_year + 1
end while
Where array access syntax is array[index]
Coefficient Tables File
The data file with the coefficients for the above algorithm has the several crops one after another, separated by a comment character (#). The first line is the name of the crop, the second is the month and day of the green-up or planting date separated by a space, and all the remaining lines are one coefficient for that day.