CoAgMET Crop ET Coefficients

We have 3 slightly different ways of calculating crop coefficients for calculate Evapotranspiration (ET) of those crops:

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:

LineContents
1crop name
2stage 2 coeffs C0 to C3
3stage 3 coeffs C0 to C3
4stage 2 K min and max, stage 3 K min and max
5Planting date (mm,dd)
6Stage sum thresholds (3)

The crop coefficients used to generate crop ET reports were developed for the Penman-Kimberly model.

{{range .Poly}}

{{.Crop}}
{{range .Coeffs}} {{.}}
{{- end -}}

{{- else -}}

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.

{{range .Tabs}}
{{.Crop}}
Green-Up Date: {{usDate .Plant}}
{{range .Coeffs}} {{- else -}} {{- end -}}
DayCoefficient
{{isoMonDay .Day}}{{.Coeff}}
No coefficients
{{- else -}}

Error loading coefficient tables.

{{- end -}}