FAO-56 Reference ET Calculator
About this app
FAO-56 Reference ET Calculator FAO-56 Reference ET Calculator Daily grass reference evapotranspiration from the FAO Penman-Monteith equation. Not a toy Hargreaves-only widget unless solar data are missing. Latitudedecimal degrees, positive north Elevationmetres Day of year1–365. 15 April = 105. Tmax°C Tmin°C Wind at 2 m u2m/s daily average Actual vapour pressure eakPa. Preferred if you measured it. Leave blank to use RH. RHmax / RHmin% . Used only if ea is blank. Enter one mean RH in RHmax if you have only one value. Solar RsMJ m⁻² day⁻¹. Leave blank if you will use sunshine hours. Sunshine hours nhours. Used with FAO as=0.25, bs=0.50 when Rs is blank. Soil heat flux GMJ m⁻² day⁻¹. Daily = 0. Monthly example uses 0.14. Calculate ETo Formula ETo = (0.408 Δ (Rn − G) + γ 900/(T+273) u2 (es − ea)) / (Δ + γ (1 + 0.34 u2)) e°(T) = 0.6108 exp(17.27 T / (T + 237.3)) es = (e°(Tmax) + e°(Tmin)) / 2 Δ = 4098 e°(Tmean) / (Tmean + 237.3)² P = 101.3 ((293 − 0.0065 z)/293)^5.26 γ = 0.665×10⁻³ P Rn from FAO-56 shortwave and net longwave (Eq. 38–39). If Rs is blank, Rs = (0.25 + 0.50 n/N) Ra. If Rs and n are both blank, the page falls back to Hargreaves (FAO-56 Eq. 52) and says so. Worked check:...
Related apps
Put this on your site
Source
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<title>FAO-56 Reference ET Calculator</title>
<meta name="description" content="Free FAO-56 Penman-Monteith ETo calculator. Daily grass reference evapotranspiration.">
<meta name="keywords" content="FAO-56, ETo, Penman-Monteith, reference evapotranspiration, irrigation, agronomy, Allen 1998">
<style>
:root { --text:#1a1a1a; --muted:#4a4a4a; --line:#d6d6d6; --bg:#fff; --panel:#f6f6f6; }
html { -webkit-text-size-adjust:100%; text-size-adjust:100%; }
* { box-sizing:border-box; }
body {
margin:0;
font:16px/1.45 system-ui,-apple-system,sans-serif;
color:var(--text);
background:var(--bg);
overflow-x:hidden;
}
main {
max-width:720px;
margin:0 auto;
padding:24px 16px 48px;
padding-left:max(16px, env(safe-area-inset-left));
padding-right:max(16px, env(safe-area-inset-right));
}
html.in-viewer main {
padding-top:calc(4.25rem + env(safe-area-inset-top, 0px));
padding-right:calc(4.75rem + env(safe-area-inset-right, 0px));
padding-bottom:calc(6.5rem + env(safe-area-inset-bottom, 0px));
}
h1 { font-size:1.35rem; margin:0 0 0.35rem; }
h2 { font-size:1.05rem; margin:1.75rem 0 0.5rem; }
p, li { color:var(--text); }
.lede, .note, .disclaimer, label span { color:var(--muted); }
.lede, .disclaimer { font-size:0.95rem; }
label span { font-weight:400; font-size:0.85rem; }
form, .stack { display:grid; gap:14px; margin:1.25rem 0; }
fieldset {
border:1px solid var(--line);
border-radius:6px;
padding:12px;
display:grid;
gap:12px;
min-width:0;
}
legend { font-weight:600; padding:0 6px; }
label { display:grid; gap:4px; font-weight:600; }
.check { display:flex; align-items:center; gap:10px; font-weight:600; }
.check input { width:22px; height:22px; min-height:22px; flex:0 0 auto; }
input, select, textarea {
font:inherit;
font-size:16px;
min-height:44px;
padding:10px 12px;
border:1px solid var(--line);
border-radius:6px;
width:100%;
max-width:100%;
background:#fff;
}
button {
font:inherit;
font-size:16px;
font-weight:600;
width:100%;
min-height:48px;
padding:12px 14px;
border:0;
border-radius:6px;
background:#1a1a1a;
color:#fff;
cursor:pointer;
}
.result {
padding:16px;
background:var(--panel);
border:1px solid var(--line);
border-radius:6px;
}
.result strong { font-size:1.35rem; }
.parts { display:grid; gap:6px; margin-top:10px; font-size:0.95rem; }
pre.formula {
white-space:pre-wrap;
overflow-wrap:anywhere;
background:var(--panel);
border:1px solid var(--line);
border-radius:6px;
padding:12px;
font-size:0.9rem;
max-width:100%;
}
ol.refs { padding-left:1.25rem; }
ol.refs li { margin-bottom:0.6rem; }
a { color:inherit; }
.table-wrap { overflow-x:auto; -webkit-overflow-scrolling:touch; max-width:100%; }
table { border-collapse:collapse; width:100%; font-size:0.9rem; }
th, td { border:1px solid var(--line); padding:8px; text-align:left; vertical-align:top; }
.muted { color:var(--muted); font-size:0.9rem; }
</style>
</head>
<body>
<main>
<h1>FAO-56 Reference ET Calculator</h1>
<p class="lede">Daily grass reference evapotranspiration from the FAO Penman-Monteith equation. Not a toy Hargreaves-only widget unless solar data are missing.</p>
<form id="calc-form">
<label>Latitude<span>decimal degrees, positive north</span>
<input id="lat" type="number" step="any" inputmode="decimal" value="13.73">
</label>
<label>Elevation<span>metres</span>
<input id="z" type="number" step="any" inputmode="decimal" value="2">
</label>
<label>Day of year<span>1–365. 15 April = 105.</span>
<input id="j" type="number" min="1" max="366" step="1" inputmode="decimal" value="105">
</label>
<label>Tmax<span>°C</span>
<input id="tmax" type="number" step="any" inputmode="decimal" value="34.8">
</label>
<label>Tmin<span>°C</span>
<input id="tmin" type="number" step="any" inputmode="decimal" value="25.6">
</label>
<label>Wind at 2 m u2<span>m/s daily average</span>
<input id="u2" type="number" min="0" step="any" inputmode="decimal" value="2">
</label>
<label>Actual vapour pressure ea<span>kPa. Preferred if you measured it. Leave blank to use RH.</span>
<input id="ea" type="number" min="0" step="any" inputmode="decimal" value="2.85">
</label>
<label>RHmax / RHmin<span>% . Used only if ea is blank. Enter one mean RH in RHmax if you have only one value.</span>
<input id="rhmax" type="number" min="0" max="100" step="any" inputmode="decimal" placeholder="RHmax %">
<input id="rhmin" type="number" min="0" max="100" step="any" inputmode="decimal" placeholder="RHmin %">
</label>
<label>Solar Rs<span>MJ m⁻² day⁻¹. Leave blank if you will use sunshine hours.</span>
<input id="rs" type="number" min="0" step="any" inputmode="decimal" placeholder="optional">
</label>
<label>Sunshine hours n<span>hours. Used with FAO as=0.25, bs=0.50 when Rs is blank.</span>
<input id="n" type="number" min="0" step="any" inputmode="decimal" value="8.5">
</label>
<label>Soil heat flux G<span>MJ m⁻² day⁻¹. Daily = 0. Monthly example uses 0.14.</span>
<input id="g" type="number" step="any" inputmode="decimal" value="0">
</label>
<button type="submit">Calculate ETo</button>
</form>
<div class="result" id="result" hidden></div>
<h2>Formula</h2>
<pre class="formula">ETo = (0.408 Δ (Rn − G) + γ 900/(T+273) u2 (es − ea))
/ (Δ + γ (1 + 0.34 u2))
e°(T) = 0.6108 exp(17.27 T / (T + 237.3))
es = (e°(Tmax) + e°(Tmin)) / 2
Δ = 4098 e°(Tmean) / (Tmean + 237.3)²
P = 101.3 ((293 − 0.0065 z)/293)^5.26
γ = 0.665×10⁻³ P
Rn from FAO-56 shortwave and net longwave (Eq. 38–39).
If Rs is blank, Rs = (0.25 + 0.50 n/N) Ra.
If Rs and n are both blank, the page falls back to Hargreaves
(FAO-56 Eq. 52) and says so.
Worked check: Bangkok April (FAO-56 Example 17) with G = 0.14
gives ETo = 5.72 mm/day.</pre>
<h2>References</h2>
<ol class="refs">
<li>Allen RG, Pereira LS, Raes D, Smith M. Crop evapotranspiration — Guidelines for computing crop water requirements. FAO Irrigation and Drainage Paper 56. Rome: FAO; 1998. Equation 6 and Chapter 4 Example 17.</li>
</ol>
<p class="disclaimer">Field planning aid only. Confirm rates with your agronomist, label, and local extension. Not a pesticide or fertilizer recommendation.</p>
</main>
<script>
if (window.self !== window.top) {
document.documentElement.classList.add('in-viewer');
}
function num(id) {
var el = document.getElementById(id);
if (!el) return 0;
var value = parseFloat(el.value);
return isFinite(value) && value > 0 ? value : 0;
}
function raw(id) {
var el = document.getElementById(id);
if (!el) return NaN;
var value = parseFloat(el.value);
return isFinite(value) ? value : NaN;
}
function sel(id) {
var el = document.getElementById(id);
return el ? el.value : '';
}
function showResult(html) {
var el = document.getElementById('result');
el.hidden = false;
el.innerHTML = html;
}
function fmt(value, digits) {
if (!isFinite(value)) return '—';
return value.toFixed(digits);
}
function satVap(t) {
return 0.6108 * Math.exp(17.27 * t / (t + 237.3));
}
function extraRa(latDeg, j) {
var gsc = 0.0820;
var phi = latDeg * Math.PI / 180;
var dr = 1 + 0.033 * Math.cos(2 * Math.PI / 365 * j);
var delta = 0.409 * Math.sin(2 * Math.PI / 365 * j - 1.39);
var arg = Math.max(-1, Math.min(1, -Math.tan(phi) * Math.tan(delta)));
var ws = Math.acos(arg);
var ra = (24 * 60 / Math.PI) * gsc * dr * (ws * Math.sin(phi) * Math.sin(delta) + Math.cos(phi) * Math.cos(delta) * Math.sin(ws));
var nMax = 24 / Math.PI * ws;
return [ra, nMax];
}
document.getElementById('calc-form').addEventListener('submit', function (event) {
event.preventDefault();
var lat = raw('lat'), z = raw('z'), j = num('j');
var tmax = raw('tmax'), tmin = raw('tmin'), u2 = raw('u2');
if (!isFinite(lat) || !isFinite(z) || !j || !isFinite(tmax) || !isFinite(tmin) || !isFinite(u2) || u2 < 0) {
showResult('<p>Enter latitude, elevation, day of year, Tmax, Tmin, and wind.</p>');
return;
}
var tmean = (tmax + tmin) / 2;
var es = (satVap(tmax) + satVap(tmin)) / 2;
var ea = raw('ea');
var rhmax = raw('rhmax'), rhmin = raw('rhmin');
if (!isFinite(ea)) {
if (isFinite(rhmax) && isFinite(rhmin)) {
ea = (satVap(tmin) * rhmax / 100 + satVap(tmax) * rhmin / 100) / 2;
} else if (isFinite(rhmax)) {
ea = (rhmax / 100) * es;
}
}
var pair = extraRa(lat, j);
var ra = pair[0], nMax = pair[1];
var rs = raw('rs'), n = raw('n'), g = raw('g');
if (!isFinite(g)) g = 0;
var method = 'FAO-56 Penman-Monteith';
var eto, rn = NaN, rsUsed = NaN;
if (!isFinite(rs) && isFinite(n) && nMax > 0) {
rs = (0.25 + 0.50 * (n / nMax)) * ra;
}
if (isFinite(rs) && isFinite(ea)) {
var delta = 4098 * satVap(tmean) / Math.pow(tmean + 237.3, 2);
var p = 101.3 * Math.pow((293 - 0.0065 * z) / 293, 5.26);
var gamma = 0.665e-3 * p;
var rso = (0.75 + 2e-5 * z) * ra;
var rns = 0.77 * rs;
var sigma = 4.903e-9;
var rnl = sigma * (Math.pow(tmax + 273.16, 4) + Math.pow(tmin + 273.16, 4)) / 2
* (0.34 - 0.14 * Math.sqrt(Math.max(0, ea)))
* (1.35 * (rs / rso) - 0.35);
rn = rns - rnl;
eto = (0.408 * delta * (rn - g) + gamma * 900 / (tmean + 273) * u2 * (es - ea))
/ (delta + gamma * (1 + 0.34 * u2));
rsUsed = rs;
} else {
method = 'Hargreaves (FAO-56 Eq. 52) because Rs and sunshine were blank or ea was missing';
var raMm = ra * 0.408;
eto = 0.0023 * (tmean + 17.8) * Math.sqrt(Math.max(0, tmax - tmin)) * raMm;
}
showResult(
'<div>ETo</div><strong>' + fmt(eto, 2) + '</strong><span> mm/day</span>' +
'<div class="parts"><div>Method: ' + method + '</div>' +
'<div>Ra = ' + fmt(ra, 2) + ' MJ m⁻² day⁻¹</div>' +
(isFinite(rsUsed) ? '<div>Rs = ' + fmt(rsUsed, 2) + ' MJ m⁻² day⁻¹</div>' : '') +
(isFinite(rn) ? '<div>Rn = ' + fmt(rn, 2) + ' MJ m⁻² day⁻¹</div>' : '') +
'<div>es = ' + fmt(es, 2) + ' kPa, ea = ' + fmt(ea, 2) + ' kPa</div></div>'
);
});
</script>
</body>
</html>
NEW APPS
These are apps made by the community!