Mercurial > dive4elements > river
diff artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculator.java @ 9504:76c0665888a3
No rounding during calculation (Meilenstein-2 2.4.2 and 2.9), delta-w-cm as double (for historical scenario)
author | mschaefer |
---|---|
date | Fri, 28 Sep 2018 10:13:09 +0200 |
parents | 853f2dafc16e |
children | 8b7bf26b8782 |
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculator.java Fri Sep 28 10:11:06 2018 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculator.java Fri Sep 28 10:13:09 2018 +0200 @@ -9,7 +9,6 @@ */ package org.dive4elements.river.artifacts.uinfo.salix; -import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -18,7 +17,6 @@ import org.dive4elements.river.artifacts.WINFOArtifact; import org.dive4elements.river.artifacts.access.ComputationRangeAccess; -import org.dive4elements.river.artifacts.common.AbstractResultType; import org.dive4elements.river.artifacts.common.GeneralResultType; import org.dive4elements.river.artifacts.common.ResultRow; import org.dive4elements.river.artifacts.model.Calculation; @@ -28,8 +26,6 @@ import org.dive4elements.river.artifacts.uinfo.UINFOArtifact; import org.dive4elements.river.artifacts.uinfo.common.UInfoResultType; import org.dive4elements.river.artifacts.uinfo.salix.SalixLineAccess.ScenarioType; -import org.dive4elements.river.artifacts.uinfo.vegetationzones.VegetationZoneServerClientXChange; -import org.dive4elements.river.utils.Formatter; /** * Calculation of the result rows of the u-info salix line calc mode @@ -38,23 +34,25 @@ */ final class SalixLineCalculator { - private static final String MAIN_VALUE_MNQ = "mnq"; - - private static final String MAIN_VALUE_MQ = "mq"; + private static final String MAIN_VALUE_MNQ = "MNQ"; - private static final String MAIN_VALUE_MHQ = "mhq"; + private static final String MAIN_VALUE_MQ = "MQ"; - private static final String MAIN_VALUE_HQ5 = "hq5"; + private static final String MAIN_VALUE_MHQ = "MHQ"; - private static final BigDecimal SALIX_DISTANCE = new BigDecimal("2.31"); + private static final String MAIN_VALUE_HQ5 = "HQ5"; + + private static final double SALIX_DISTANCE = 2.31; private final List<ResultRow> rows = new ArrayList<>(); private final RiverInfoProvider riverInfoProvider; + public SalixLineCalculator(final RiverInfoProvider riverInfoProvider) { this.riverInfoProvider = riverInfoProvider; } + /** * Calculate the salix line result rows */ @@ -98,8 +96,6 @@ /** * Create a result row for a station and its gauge, and add w-q-values as selected - * - * @param mainWstValues */ private ResultRow createRow(final MainWstValuesCalculator mainWstValues, final double station, final NavigableMap<Double, List<Double>> rangeScenarios) { @@ -123,7 +119,7 @@ // Calc salix-line and mw-mnw row.putValue(UInfoResultType.salixline, calcSalix(mhw, mw, 0.0)); row.putValue(UInfoResultType.salix_mw_mnw, calcMwmnw(mw, mnw)); - final double salixw = Formatter.roundW(mhw).subtract(SALIX_DISTANCE).doubleValue(); + final double salixw = mhw - SALIX_DISTANCE; row.putValue(UInfoResultType.salixw, salixw); // Calc scenario values (always all scenario types set, Result variant extracts the fields needed) final List<SalixScenario> scenarios = new ArrayList<>(); @@ -132,7 +128,7 @@ if (deltaw != null) { final double salix = calcSalix(mhw, mw, deltaw.doubleValue()); final double scen = calcSalix(mhw, 0.0, deltaw.doubleValue()); - scenarios.add(new SalixScenario((int) (deltaw * 100), salix, scen)); + scenarios.add(new SalixScenario(deltaw * 100, salix, scen)); } else { scenarios.add(null); } @@ -148,7 +144,7 @@ private double calcSalix(final double mhw, final double mw, final double deltamw) { if (Double.isNaN(mw) || Double.isInfinite(mw) || Double.isNaN(mhw) || Double.isInfinite(mhw)) return mhw - mw; // preserving NaN or Infinity - return Formatter.roundW(mhw).subtract(SALIX_DISTANCE).subtract(Formatter.roundW(mw).add(Formatter.roundW(deltamw))).doubleValue(); + return mhw - SALIX_DISTANCE - mw - deltamw; } /** @@ -157,7 +153,7 @@ private double calcMwmnw(final double mw, final double mnw) { if (Double.isNaN(mw) || Double.isInfinite(mw) || Double.isNaN(mnw) || Double.isInfinite(mnw)) return mnw - mw; // preserving NaN or Inifinity - return Formatter.roundW(mnw).subtract(Formatter.roundW(mw)).doubleValue(); + return mnw - mw; } /** @@ -174,19 +170,6 @@ } /** - * Find and return a height (iota, w main value) of a station in a previously calculated result - */ - public double fetchStationHeight(final Calculation problems, final double station, final AbstractResultType resultType, - final SalixLineCalculationResult result) { - - // Search the station in the previously calculated result rows - final ResultRow stationRow = searchStation(station, result.getRows()); - if (stationRow != null) - return stationRow.getDoubleValue(resultType); - return Double.NaN; - } - - /** * Searches the row of a station in a result rows collection */ private ResultRow searchStation(final double station, final Collection<ResultRow> rows) { @@ -196,29 +179,4 @@ } return null; } - - /** - * Computes the height of a vegetation zone limit for a station and a previously computed salix line result - */ - public double computeVegetationZoneHeight(final Calculation problems, final double station, final int vegetationZoneType, - final SalixLineCalculationResult result) { - - // Search the station in the previously calculated result rows - final ResultRow stationRow = searchStation(station, result.getRows()); - if (stationRow == null) - return Double.NaN; - - // Compute height from overflow duration days - final List<VegetationZoneServerClientXChange> vzs = VegetationZoneServerClientXChange.getStandardList(null, null); // TODO river, context - if ((vegetationZoneType >= 1) && (vegetationZoneType <= vzs.size())) { - final int uefd = vzs.get(vegetationZoneType - 1).getMin_day_overflow(); - // Üfd = -70,559 ∗ ln((DGM - MW) + 0,5) + 80,711 - final double f1 = -70.559; - final double f2 = -88.711; - final double mw = stationRow.getDoubleValue(UInfoResultType.waterlevelMW); - final double dgm = Math.exp((uefd - f2) / f1) + mw - 0.5; - return dgm; - } - return Double.NaN; - } }