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.