Mercurial > dive4elements > river
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. */ |