comparison artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentDensity.java @ 6970:7be97faf5848

flys/issue1235: Same kicks against a few inconsistencies and bugs in the calculation of sediment loads. I believe it _do_not_ delivers the right results.
author Sascha L. Teichmann <teichmann@intevation.de>
date Thu, 05 Sep 2013 17:15:04 +0200
parents 13c2762270a6
children 483cae8915f6
comparison
equal deleted inserted replaced
6969:c137f5028591 6970:7be97faf5848
93 93
94 private double getDensityAtKm( 94 private double getDensityAtKm(
95 List<SedimentDensityValue> values, 95 List<SedimentDensityValue> values,
96 double km 96 double km
97 ) { 97 ) {
98 boolean found = false;
99 SedimentDensityValue prev = null; 98 SedimentDensityValue prev = null;
100 SedimentDensityValue next = null; 99 SedimentDensityValue next = null;
101 for (SedimentDensityValue sdv: values) { 100 for (SedimentDensityValue sdv: values) {
102 logger.debug("year: " + sdv.getYear()); 101 logger.debug("year: " + sdv.getYear());
103 if (sdv.getKm() == km) { 102 if (Math.abs(sdv.getKm() - km) < 0.00001) {
104 prev = sdv; 103 return prev.getDensity();
105 found = true;
106 break;
107 } 104 }
108 if (sdv.getKm() > km) { 105 if (sdv.getKm() > km) {
109 next = sdv; 106 next = sdv;
110 break; 107 break;
111 } 108 }
112 prev = sdv; 109 prev = sdv;
113 } 110 }
114 if (found) { 111 return spline(prev, next, km);
115 return prev.getDensity();
116 }
117 else {
118 return spline(prev, next, km);
119 }
120 } 112 }
121 113
122 private double spline( 114 private static double spline(
123 SedimentDensityValue prev, 115 SedimentDensityValue prev,
124 SedimentDensityValue next, 116 SedimentDensityValue next,
125 double km 117 double km
126 ) { 118 ) {
119 if (prev == null && next == null) {
120 logger.warn("prev and next are null -> NaN");
121 return Double.NaN;
122 }
123
124 if (prev == null) return next.getDensity();
125 if (next == null) return prev.getDensity();
126
127 // XXX: This is no spline interpolation!
127 double lower = prev.getKm(); 128 double lower = prev.getKm();
128 double upper = next.getKm(); 129 double upper = next.getKm();
129 double upperDensity = next.getDensity(); 130 double upperDensity = next.getDensity();
130 double lowerDensity = prev.getDensity(); 131 double lowerDensity = prev.getDensity();
131 132
132 double m =(upperDensity - lowerDensity)/(upper - lower); 133 double m = (upperDensity - lowerDensity)/(upper - lower);
133 double b = lowerDensity - (m * lower); 134 double b = lowerDensity - (m * lower);
134 return (m * km) + b; 135 return m * km + b;
135 } 136 }
136 137
137 138
138 /** If multiple values for same year and station are found, 139 /** If multiple values for same year and station are found,
139 * build and store average, dismiss multiple values. */ 140 * build and store average, dismiss multiple values. */

http://dive4elements.wald.intevation.org