comparison artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculator.java @ 9490:e44c1a8b0c54

Fixed: rounding problems in iota/salix scenario calculation
author mschaefer
date Wed, 19 Sep 2018 16:21:08 +0200
parents 515643b2c49a
children 853f2dafc16e
comparison
equal deleted inserted replaced
9489:8562c60371b8 9490:e44c1a8b0c54
165 row.putValue(UInfoResultType.waterlevelMW, mw); 165 row.putValue(UInfoResultType.waterlevelMW, mw);
166 row.putValue(UInfoResultType.waterlevelMHW, mhw); 166 row.putValue(UInfoResultType.waterlevelMHW, mhw);
167 row.putValue(UInfoResultType.waterlevelMH5, hw5); 167 row.putValue(UInfoResultType.waterlevelMH5, hw5);
168 168
169 // Calc salix-line and mw-mnw 169 // Calc salix-line and mw-mnw
170 row.putValue(UInfoResultType.salixline, calcSalix(mhw, mw)); 170 row.putValue(UInfoResultType.salixline, calcSalix(mhw, mw, 0.0));
171 row.putValue(UInfoResultType.salix_mw_mnw, calcMwmnw(mw, mnw)); 171 row.putValue(UInfoResultType.salix_mw_mnw, calcMwmnw(mw, mnw));
172 row.putValue(UInfoResultType.salixw, mhw - SALIX_DISTANCE.doubleValue()); 172 final double salixw = Formatter.roundW(mhw).subtract(SALIX_DISTANCE).doubleValue();
173 row.putValue(UInfoResultType.salixw, salixw);
173 // Calc scenario values (always all scenario types set, Result variant extracts the fields needed) 174 // Calc scenario values (always all scenario types set, Result variant extracts the fields needed)
174 final List<SalixScenario> scenarios = new ArrayList<>(); 175 final List<SalixScenario> scenarios = new ArrayList<>();
175 final List<Double> deltaws = getDeltaWs(station, rangeScenarios); 176 final List<Double> deltaws = getDeltaWs(station, rangeScenarios);
176 for (final Double deltaw : deltaws) { 177 for (final Double deltaw : deltaws) {
177 if (deltaw != null) { 178 if (deltaw != null) {
178 final double salix = calcSalix(mhw, mw + deltaw); 179 final double salix = calcSalix(mhw, mw, deltaw.doubleValue());
179 scenarios.add(new SalixScenario((int) (deltaw * 100), salix, mhw + deltaw - SALIX_DISTANCE.doubleValue())); 180 final double scen = calcSalix(mhw, 0.0, deltaw.doubleValue());
181 scenarios.add(new SalixScenario((int) (deltaw * 100), salix, scen));
180 } 182 }
181 else { 183 else {
182 scenarios.add(null); 184 scenarios.add(null);
183 } 185 }
184 } 186 }
197 } 199 }
198 200
199 /** 201 /**
200 * Calculates the salix value 202 * Calculates the salix value
201 */ 203 */
202 private double calcSalix(final double mhw, final double mw) { 204 private double calcSalix(final double mhw, final double mw, final double deltamw) {
203 if (Double.isNaN(mw) || Double.isInfinite(mw) || Double.isNaN(mhw) || Double.isInfinite(mhw)) 205 if (Double.isNaN(mw) || Double.isInfinite(mw) || Double.isNaN(mhw) || Double.isInfinite(mhw))
204 return mw; // preserving NaN or Infinity 206 return mhw - mw; // preserving NaN or Infinity
205 return Formatter.roundW(mhw).subtract(SALIX_DISTANCE).subtract(Formatter.roundW(mw)).doubleValue(); 207 return Formatter.roundW(mhw).subtract(SALIX_DISTANCE).subtract(Formatter.roundW(mw).add(Formatter.roundW(deltamw))).doubleValue();
206 } 208 }
207 209
208 /** 210 /**
209 * Calculates the inverse MW-MNW difference 211 * Calculates the inverse MW-MNW difference
210 */ 212 */

http://dive4elements.wald.intevation.org