## 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_sum^{2}+ c3 * frac_sum^{3}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.