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