Mercurial > dive4elements > river
comparison 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 |
comparison
equal
deleted
inserted
replaced
8914:e3519c3e7a0a | 8915:d9dbf0b74bc2 |
---|---|
1 /* Copyright (C) 2017 by Bundesanstalt für Gewässerkunde | |
2 * Software engineering by | |
3 * Björnsen Beratende Ingenieure GmbH | |
4 * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt | |
5 * | |
6 * This file is Free Software under the GNU AGPL (>=v3) | |
7 * and comes with ABSOLUTELY NO WARRANTY! Check out the | |
8 * documentation coming with Dive4Elements River for details. | |
9 */ | |
10 | |
11 package org.dive4elements.river.artifacts.sinfo.tkhcalculation; | |
12 | |
13 import java.util.ArrayList; | |
14 import java.util.List; | |
15 | |
16 import org.apache.commons.lang.math.DoubleRange; | |
17 import org.apache.commons.math.ArgumentOutsideDomainException; | |
18 import org.dive4elements.river.model.River; | |
19 | |
20 import gnu.trove.TDoubleArrayList; | |
21 | |
22 /** | |
23 * @author Matthias Schäfer | |
24 */ | |
25 final class SoilKindKmValueFinder { | |
26 // /** | |
27 // * Private log to use here. | |
28 // */ | |
29 // private static Logger log = Logger.getLogger(SoilKindKmValueFinder.class); | |
30 | |
31 private final TDoubleArrayList kms = new TDoubleArrayList(); | |
32 | |
33 private final List<SoilKind> values = new ArrayList<>(); | |
34 | |
35 /** | |
36 * Loads the range of the river's kms with their soil kind. | |
37 * | |
38 * @return Whether the load has been successful | |
39 */ | |
40 public static SoilKindKmValueFinder loadValues(final River river, final DoubleRange kmRange) { | |
41 | |
42 final SoilKindKmValueFinder instance = new SoilKindKmValueFinder(); | |
43 | |
44 // FIXME Echte Daten aus der Datenbank abfragen | |
45 instance.addKmKind(0, SoilKind.starr); | |
46 instance.addKmKind(15.7, SoilKind.mobil); | |
47 instance.addKmKind(15.8, SoilKind.mobil); | |
48 instance.addKmKind(15.9, SoilKind.starr); | |
49 instance.addKmKind(108.7, SoilKind.mobil); | |
50 instance.addKmKind(108.8, SoilKind.mobil); | |
51 instance.addKmKind(108.9, SoilKind.starr); | |
52 instance.addKmKind(119.1, SoilKind.mobil); | |
53 instance.addKmKind(119.4, SoilKind.mobil); | |
54 instance.addKmKind(119.5, SoilKind.starr); | |
55 instance.addKmKind(128.3, SoilKind.mobil); | |
56 instance.addKmKind(128.9, SoilKind.mobil); | |
57 instance.addKmKind(129, SoilKind.starr); | |
58 instance.addKmKind(133.1, SoilKind.mobil); | |
59 instance.addKmKind(135.9, SoilKind.mobil); | |
60 instance.addKmKind(136, SoilKind.starr); | |
61 instance.addKmKind(136.5, SoilKind.mobil); | |
62 instance.addKmKind(139.9, SoilKind.mobil); | |
63 instance.addKmKind(140, SoilKind.starr); | |
64 instance.addKmKind(140.5, SoilKind.mobil); | |
65 instance.addKmKind(165, SoilKind.mobil); | |
66 instance.addKmKind(165.1, SoilKind.starr); | |
67 instance.addKmKind(165.9, SoilKind.mobil); | |
68 instance.addKmKind(180.8, SoilKind.mobil); | |
69 instance.addKmKind(180.9, SoilKind.starr); | |
70 instance.addKmKind(182, SoilKind.mobil); | |
71 instance.addKmKind(221.3, SoilKind.mobil); | |
72 | |
73 return instance; | |
74 } | |
75 | |
76 private SoilKindKmValueFinder() { | |
77 /* only instantiate me via static constructor */ | |
78 } | |
79 | |
80 /***** METHODS *****/ | |
81 | |
82 /** | |
83 * Searches a km with its soil kind | |
84 */ | |
85 public SoilKind findSoilKind(final double km) throws ArgumentOutsideDomainException { | |
86 if ((this.kms == null) || (this.kms.size() == 0)) | |
87 throw new ArgumentOutsideDomainException(km, Double.NaN, Double.NaN); | |
88 | |
89 // TODO: Voraussetzung für die binäre suche ist, dass nach km sortiert ist. | |
90 // In diesem Fall könnte man ggf. auch gleich eine bessere Datenklasse benutzen, z.B. eine TreeMap<Double, SoilKind> | |
91 // (also station -> art), und deren funktionen zum finden verwenden: | |
92 // final double station = 0.0; | |
93 // final NavigableMap<Double, SoilKind> data = new TreeMap<>(); | |
94 // data.ceilingEntry(station); | |
95 // data.floorEntry(station); | |
96 | |
97 int i = this.kms.binarySearch(km); | |
98 if (i >= 0) { | |
99 // Exact km match | |
100 return this.values.get(i); | |
101 } else { | |
102 // Out of range or within km interval | |
103 if (i < 0) | |
104 i = -i - 1; | |
105 if ((i <= 0) || (i >= this.kms.size())) | |
106 throw new ArgumentOutsideDomainException(km, Double.NaN, Double.NaN); | |
107 if (km <= ((this.kms.get(i - 1) + this.kms.get(i)) / 2)) | |
108 return this.values.get(i - 1); | |
109 else | |
110 return this.values.get(i); | |
111 } | |
112 } | |
113 | |
114 private void addKmKind(final double km, final SoilKind kind) { | |
115 this.kms.add(km); | |
116 this.values.add(kind); | |
117 } | |
118 } |