Commit 6e254759 authored by Eric Duminil's avatar Eric Duminil
Browse files

bugfix

Extraterrestrial radiation should depend on latitude
parent 31031beb
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -49,12 +49,15 @@ public class TreeWaterDemand { ...@@ -49,12 +49,15 @@ public class TreeWaterDemand {
} }
} }
double longitude = 9.933333; // Würzburg
double longitude = 9.9;
double latitude = 49.8;
// germany = 345 // germany = 345
// Longitude of middle of time zone.
double lz = 345; double lz = 345;
// Würzburg = // West_positive_longitude
double lm = 360 - longitude; double lm = 360 - longitude;
double height = 177; double altitude = 177;
double svf = 1; double svf = 1;
double advection = 1.6; double advection = 1.6;
...@@ -101,10 +104,10 @@ public class TreeWaterDemand { ...@@ -101,10 +104,10 @@ public class TreeWaterDemand {
int dayOfYear = counter.getDayOfYear(); int dayOfYear = counter.getDayOfYear();
double hourOfDay = counter.getHour() + 0.5; double hourOfDay = counter.getHour() + 0.5;
double extraterrestrialRadiation = ra(dayOfYear, hourOfDay, lz, lm); double extraterrestrialRadiation = ra(dayOfYear, hourOfDay, lz, lm, latitude);
double netLongwaveRadiation = rnl(temp, actualVaporPressure, incomingRadiation, height, extraterrestrialRadiation); double netLongwaveRadiation = rnl(temp, actualVaporPressure, incomingRadiation, altitude, extraterrestrialRadiation);
double netRadiation = rn(incomingRadiation, netLongwaveRadiation); double netRadiation = rn(incomingRadiation, netLongwaveRadiation);
double et0 = et0(temp, actualVaporPressure, incomingRadiation, height, windSpeed, humidity, netRadiation); double et0 = et0(temp, actualVaporPressure, incomingRadiation, altitude, windSpeed, humidity, netRadiation);
double et0u = et0u(svf, advection, et0); double et0u = et0u(svf, advection, et0);
...@@ -112,7 +115,7 @@ public class TreeWaterDemand { ...@@ -112,7 +115,7 @@ public class TreeWaterDemand {
bw.write(String.format(";%.1f", windSpeed)); bw.write(String.format(";%.1f", windSpeed));
bw.write(String.format(";%.5f", saturationVaporPressure)); bw.write(String.format(";%.5f", saturationVaporPressure));
bw.write(String.format(";%.5f", actualVaporPressure)); bw.write(String.format(";%.5f", actualVaporPressure));
bw.write(String.format(";%.5f", gamma(height))); bw.write(String.format(";%.5f", gamma(altitude)));
bw.write(String.format(";%.5f", extraterrestrialRadiation)); bw.write(String.format(";%.5f", extraterrestrialRadiation));
bw.write(String.format(";%.5f", netRadiation)); bw.write(String.format(";%.5f", netRadiation));
bw.write(String.format(";%.3f", et0)); bw.write(String.format(";%.3f", et0));
...@@ -158,9 +161,9 @@ public class TreeWaterDemand { ...@@ -158,9 +161,9 @@ public class TreeWaterDemand {
return svf * advection * et0; return svf * advection * et0;
} }
private static double et0(double temperature, double actualVaporPressure, double shortWaveRadiation, double height, private static double et0(double temperature, double actualVaporPressure, double shortWaveRadiation, double altitude,
double windSpeed, double humidity, double netRadiation) { double windSpeed, double humidity, double netRadiation) {
double gamma = gamma(height); double gamma = gamma(altitude);
double saturationVaporPressure = saturationVaporPressure(temperature); double saturationVaporPressure = saturationVaporPressure(temperature);
double delta = delta(temperature, saturationVaporPressure); double delta = delta(temperature, saturationVaporPressure);
double g = g(netRadiation, shortWaveRadiation > 0); double g = g(netRadiation, shortWaveRadiation > 0);
...@@ -177,8 +180,8 @@ public class TreeWaterDemand { ...@@ -177,8 +180,8 @@ public class TreeWaterDemand {
return 0.6108 * Math.exp((17.27 * temperature) / (temperature + 237.3)); return 0.6108 * Math.exp((17.27 * temperature) / (temperature + 237.3));
} }
private static double gamma(double height) { private static double gamma(double altitude) {
double pressure = 101.3 * Math.pow((293 - 0.0065 * height) / 293, 5.26); double pressure = 101.3 * Math.pow((293 - 0.0065 * altitude) / 293, 5.26);
return 0.665 * 0.001 * pressure; return 0.665 * 0.001 * pressure;
} }
...@@ -199,12 +202,12 @@ public class TreeWaterDemand { ...@@ -199,12 +202,12 @@ public class TreeWaterDemand {
// NetLongwaveRadiation // NetLongwaveRadiation
// unit is apparently [MJ / (m².h)] // unit is apparently [MJ / (m².h)]
private static double rnl(double temperature, double actualVaporPressure, double shortWaveRadiation, double height, private static double rnl(double temperature, double actualVaporPressure, double shortWaveRadiation, double altitude,
double extraterrestrialRadiation){ double extraterrestrialRadiation){
// divide by 24 for hourly // divide by 24 for hourly
double sigma = 4.903E-9 / 24; double sigma = 4.903E-9 / 24;
double rs = shortWaveRadiation; double rs = shortWaveRadiation;
double rso = (0.75 + 2 * 10E-5 * height) * extraterrestrialRadiation; double rso = (0.75 + 2 * 10E-5 * altitude) * extraterrestrialRadiation;
double rsRsoQuotient = 0.5; double rsRsoQuotient = 0.5;
if (rso != 0) { if (rso != 0) {
rsRsoQuotient = rs / rso; rsRsoQuotient = rs / rso;
...@@ -217,12 +220,12 @@ public class TreeWaterDemand { ...@@ -217,12 +220,12 @@ public class TreeWaterDemand {
} }
// ExtraterrestrialRadiation // ExtraterrestrialRadiation
private static double ra(int dayOfYear, double hourOfDay, double lz, double lm) { private static double ra(int dayOfYear, double hourOfDay, double lz, double lm, double latitude) {
double dr = 1 + 0.033 * Math.cos(2 * Math.PI * dayOfYear / 365d); double dr = 1 + 0.033 * Math.cos(2 * Math.PI * dayOfYear / 365d);
double b = (2 * Math.PI * (dayOfYear - 81)) / 364; double b = (2 * Math.PI * (dayOfYear - 81)) / 364;
double sc = 0.1645 * Math.sin(2 * b) - 0.1255 * Math.cos(b) - 0.025 * Math.sin(b); double sc = 0.1645 * Math.sin(2 * b) - 0.1255 * Math.cos(b) - 0.025 * Math.sin(b);
double omega = Math.PI / 12 * ((hourOfDay + 0.06667 * (lz - lm) + sc) - 12); double omega = Math.PI / 12 * ((hourOfDay + 0.06667 * (lz - lm) + sc) - 12);
double phi = lm * Math.PI / 180; double phi = latitude * Math.PI / 180;
double delta = 0.409 * Math.sin(2 * Math.PI / 365 * dayOfYear - 1.39); double delta = 0.409 * Math.sin(2 * Math.PI / 365 * dayOfYear - 1.39);
double omegas = Math.acos(-Math.tan(phi) * Math.tan(delta)); double omegas = Math.acos(-Math.tan(phi) * Math.tan(delta));
double ra = 0; double ra = 0;
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment