Mercurial > dive4elements > river
view artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhcalculation/SoilKindKmValueFinder.java @ 8915:d9dbf0b74bc2
Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
author | gernotbelger |
---|---|
date | Wed, 28 Feb 2018 17:27:15 +0100 |
parents | artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/SoilKindKmValueFinder.java@89f3c5462a16 |
children | 1a8f19f3b776 |
line wrap: on
line source
/* Copyright (C) 2017 by Bundesanstalt für Gewässerkunde * Software engineering by * Björnsen Beratende Ingenieure GmbH * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt * * This file is Free Software under the GNU AGPL (>=v3) * and comes with ABSOLUTELY NO WARRANTY! Check out the * documentation coming with Dive4Elements River for details. */ package org.dive4elements.river.artifacts.sinfo.tkhcalculation; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang.math.DoubleRange; import org.apache.commons.math.ArgumentOutsideDomainException; import org.dive4elements.river.model.River; import gnu.trove.TDoubleArrayList; /** * @author Matthias Schäfer */ final class SoilKindKmValueFinder { // /** // * Private log to use here. // */ // private static Logger log = Logger.getLogger(SoilKindKmValueFinder.class); private final TDoubleArrayList kms = new TDoubleArrayList(); private final List<SoilKind> values = new ArrayList<>(); /** * Loads the range of the river's kms with their soil kind. * * @return Whether the load has been successful */ public static SoilKindKmValueFinder loadValues(final River river, final DoubleRange kmRange) { final SoilKindKmValueFinder instance = new SoilKindKmValueFinder(); // FIXME Echte Daten aus der Datenbank abfragen instance.addKmKind(0, SoilKind.starr); instance.addKmKind(15.7, SoilKind.mobil); instance.addKmKind(15.8, SoilKind.mobil); instance.addKmKind(15.9, SoilKind.starr); instance.addKmKind(108.7, SoilKind.mobil); instance.addKmKind(108.8, SoilKind.mobil); instance.addKmKind(108.9, SoilKind.starr); instance.addKmKind(119.1, SoilKind.mobil); instance.addKmKind(119.4, SoilKind.mobil); instance.addKmKind(119.5, SoilKind.starr); instance.addKmKind(128.3, SoilKind.mobil); instance.addKmKind(128.9, SoilKind.mobil); instance.addKmKind(129, SoilKind.starr); instance.addKmKind(133.1, SoilKind.mobil); instance.addKmKind(135.9, SoilKind.mobil); instance.addKmKind(136, SoilKind.starr); instance.addKmKind(136.5, SoilKind.mobil); instance.addKmKind(139.9, SoilKind.mobil); instance.addKmKind(140, SoilKind.starr); instance.addKmKind(140.5, SoilKind.mobil); instance.addKmKind(165, SoilKind.mobil); instance.addKmKind(165.1, SoilKind.starr); instance.addKmKind(165.9, SoilKind.mobil); instance.addKmKind(180.8, SoilKind.mobil); instance.addKmKind(180.9, SoilKind.starr); instance.addKmKind(182, SoilKind.mobil); instance.addKmKind(221.3, SoilKind.mobil); return instance; } private SoilKindKmValueFinder() { /* only instantiate me via static constructor */ } /***** METHODS *****/ /** * Searches a km with its soil kind */ public SoilKind findSoilKind(final double km) throws ArgumentOutsideDomainException { if ((this.kms == null) || (this.kms.size() == 0)) throw new ArgumentOutsideDomainException(km, Double.NaN, Double.NaN); // TODO: Voraussetzung für die binäre suche ist, dass nach km sortiert ist. // In diesem Fall könnte man ggf. auch gleich eine bessere Datenklasse benutzen, z.B. eine TreeMap<Double, SoilKind> // (also station -> art), und deren funktionen zum finden verwenden: // final double station = 0.0; // final NavigableMap<Double, SoilKind> data = new TreeMap<>(); // data.ceilingEntry(station); // data.floorEntry(station); int i = this.kms.binarySearch(km); if (i >= 0) { // Exact km match return this.values.get(i); } else { // Out of range or within km interval if (i < 0) i = -i - 1; if ((i <= 0) || (i >= this.kms.size())) throw new ArgumentOutsideDomainException(km, Double.NaN, Double.NaN); if (km <= ((this.kms.get(i - 1) + this.kms.get(i)) / 2)) return this.values.get(i - 1); else return this.values.get(i); } } private void addKmKind(final double km, final SoilKind kind) { this.kms.add(km); this.values.add(kind); } }