annotate artifacts/src/main/java/org/dive4elements/river/artifacts/model/WstValueTable.java @ 8662:c9b8ad659d5b

Use EpsilonComparator instead of redundant implementation.
author "Tom Gottfried <tom@intevation.de>"
date Tue, 07 Apr 2015 11:20:36 +0200
parents a9ff696c2d18
children b78ca00d4659
rev   line source
5863
4897a58c8746 River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
1 /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde
4897a58c8746 River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
2 * Software engineering by Intevation GmbH
4897a58c8746 River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
3 *
5994
af13ceeba52a Removed trailing whitespace.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5863
diff changeset
4 * This file is Free Software under the GNU AGPL (>=v3)
5863
4897a58c8746 River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
5 * and comes with ABSOLUTELY NO WARRANTY! Check out the
5994
af13ceeba52a Removed trailing whitespace.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5863
diff changeset
6 * documentation coming with Dive4Elements River for details.
5863
4897a58c8746 River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
7 */
4897a58c8746 River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
8
5831
bd047b71ab37 Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4797
diff changeset
9 package org.dive4elements.river.artifacts.model;
326
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
10
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
11 import java.io.Serializable;
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
12
5831
bd047b71ab37 Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4797
diff changeset
13 import org.dive4elements.river.artifacts.math.Linear;
bd047b71ab37 Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4797
diff changeset
14 import org.dive4elements.river.artifacts.math.Function;
6434
898afcce1d0a Partial fix for flys/1303
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5994
diff changeset
15 import org.dive4elements.river.utils.DoubleUtil;
427
909196be11a0 First step to calculate "W fuer ungleichwertige Abfluesse" correctly. flys/issue55
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 426
diff changeset
16
335
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
17 import java.util.Arrays;
326
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
18 import java.util.ArrayList;
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
19 import java.util.List;
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
20 import java.util.Collections;
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
21
339
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
22 import org.apache.log4j.Logger;
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
23
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
24 import org.apache.commons.math.analysis.interpolation.SplineInterpolator;
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
25
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
26 import org.apache.commons.math.analysis.polynomials.PolynomialSplineFunction;
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
27
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
28 import org.apache.commons.math.ArgumentOutsideDomainException;
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
29
686
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
30 import org.apache.commons.math.exception.MathIllegalArgumentException;
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
31
1937
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
32 import gnu.trove.TDoubleArrayList;
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
33
8662
c9b8ad659d5b Use EpsilonComparator instead of redundant implementation.
"Tom Gottfried <tom@intevation.de>"
parents: 7015
diff changeset
34 import static org.dive4elements.river.backend.utils.EpsilonComparator.CMP;
c9b8ad659d5b Use EpsilonComparator instead of redundant implementation.
"Tom Gottfried <tom@intevation.de>"
parents: 7015
diff changeset
35
1838
853cd2120d69 Cosmetics, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1721
diff changeset
36 /**
853cd2120d69 Cosmetics, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1721
diff changeset
37 * W, Q and km data from database 'wsts' spiced with interpolation algorithms.
853cd2120d69 Cosmetics, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1721
diff changeset
38 */
326
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
39 public class WstValueTable
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
40 implements Serializable
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
41 {
339
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
42 private static Logger log = Logger.getLogger(WstValueTable.class);
326
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
43
395
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
44 public static final int DEFAULT_Q_STEPS = 500;
339
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
45
2253
707b47d8c554 Dont sort the data series in reference curve.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2248
diff changeset
46 public static final int RELATE_WS_SAMPLES = 200;
2186
ec2574eb2d32 Added calculation class for "Bezugslinienverfahren" to created by WINFOArtifact.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2166
diff changeset
47
1721
eb35570df0e8 Cosmetics, docs.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1681
diff changeset
48 /**
eb35570df0e8 Cosmetics, docs.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1681
diff changeset
49 * A Column in the table, typically representing one measurement session.
eb35570df0e8 Cosmetics, docs.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1681
diff changeset
50 */
633
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
51 public static final class Column
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
52 implements Serializable
326
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
53 {
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
54 protected String name;
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
55
632
07640ab913fd First part of storing qs in ranges
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 621
diff changeset
56 protected QRangeTree qRangeTree;
07640ab913fd First part of storing qs in ranges
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 621
diff changeset
57
326
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
58 public Column() {
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
59 }
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
60
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
61 public Column(String name) {
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
62 this.name = name;
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
63 }
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
64
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
65 public String getName() {
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
66 return name;
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
67 }
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
68
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
69 public void setName(String name) {
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
70 this.name = name;
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
71 }
632
07640ab913fd First part of storing qs in ranges
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 621
diff changeset
72
4797
43e69af28b3c A naive algorithm to figure out the "Umhuellende" of a set of WQKms.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4119
diff changeset
73 public QRangeTree getQRangeTree() {
632
07640ab913fd First part of storing qs in ranges
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 621
diff changeset
74 return qRangeTree;
07640ab913fd First part of storing qs in ranges
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 621
diff changeset
75 }
07640ab913fd First part of storing qs in ranges
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 621
diff changeset
76
07640ab913fd First part of storing qs in ranges
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 621
diff changeset
77 public void setQRangeTree(QRangeTree qRangeTree) {
07640ab913fd First part of storing qs in ranges
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 621
diff changeset
78 this.qRangeTree = qRangeTree;
07640ab913fd First part of storing qs in ranges
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 621
diff changeset
79 }
633
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
80 } // class Column
326
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
81
1721
eb35570df0e8 Cosmetics, docs.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1681
diff changeset
82 /**
eb35570df0e8 Cosmetics, docs.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1681
diff changeset
83 * A (weighted) position used for interpolation.
eb35570df0e8 Cosmetics, docs.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1681
diff changeset
84 */
633
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
85 public static final class QPosition {
426
c6b7ca0febcb Fix step to fix issue69: Do the right calculation
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 395
diff changeset
86
c6b7ca0febcb Fix step to fix issue69: Do the right calculation
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 395
diff changeset
87 protected int index;
c6b7ca0febcb Fix step to fix issue69: Do the right calculation
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 395
diff changeset
88 protected double weight;
c6b7ca0febcb Fix step to fix issue69: Do the right calculation
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 395
diff changeset
89
c6b7ca0febcb Fix step to fix issue69: Do the right calculation
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 395
diff changeset
90 public QPosition() {
c6b7ca0febcb Fix step to fix issue69: Do the right calculation
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 395
diff changeset
91 }
c6b7ca0febcb Fix step to fix issue69: Do the right calculation
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 395
diff changeset
92
633
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
93 public QPosition(int index, double weight) {
426
c6b7ca0febcb Fix step to fix issue69: Do the right calculation
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 395
diff changeset
94 this.index = index;
c6b7ca0febcb Fix step to fix issue69: Do the right calculation
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 395
diff changeset
95 this.weight = weight;
c6b7ca0febcb Fix step to fix issue69: Do the right calculation
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 395
diff changeset
96 }
c6b7ca0febcb Fix step to fix issue69: Do the right calculation
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 395
diff changeset
97
633
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
98 public QPosition set(int index, double weight) {
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
99 this.index = index;
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
100 this.weight = weight;
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
101 return this;
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
102 }
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
103
426
c6b7ca0febcb Fix step to fix issue69: Do the right calculation
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 395
diff changeset
104 } // class Position
c6b7ca0febcb Fix step to fix issue69: Do the right calculation
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 395
diff changeset
105
1939
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
106 public static final class SplineFunction {
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
107
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
108 public PolynomialSplineFunction spline;
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
109 public double [] splineQs;
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
110 public double [] splineWs;
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
111
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
112 public SplineFunction(
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
113 PolynomialSplineFunction spline,
3076
5642a83420f2 FLYS artifacts: Removed trailing whitespace.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2560
diff changeset
114 double [] splineQs,
1939
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
115 double [] splineWs
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
116 ) {
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
117 this.spline = spline;
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
118 this.splineQs = splineQs;
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
119 this.splineWs = splineWs;
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
120 }
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
121
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
122 public double [][] sample(
3076
5642a83420f2 FLYS artifacts: Removed trailing whitespace.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2560
diff changeset
123 int numSamples,
5642a83420f2 FLYS artifacts: Removed trailing whitespace.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2560
diff changeset
124 double km,
1939
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
125 Calculation errors
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
126 ) {
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
127 double minQ = getQMin();
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
128 double maxQ = getQMax();
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
129
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
130 double [] outWs = new double[numSamples];
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
131 double [] outQs = new double[numSamples];
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
132
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
133 Arrays.fill(outWs, Double.NaN);
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
134 Arrays.fill(outQs, Double.NaN);
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
135
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
136 double stepWidth = (maxQ - minQ)/numSamples;
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
137
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
138 try {
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
139 double q = minQ;
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
140 for (int i = 0; i < outWs.length; ++i, q += stepWidth) {
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
141 outWs[i] = spline.value(outQs[i] = q);
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
142 }
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
143 }
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
144 catch (ArgumentOutsideDomainException aode) {
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
145 if (errors != null) {
2166
2898b1ff6013 I18N for WINFO calculation result messages.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1939
diff changeset
146 errors.addProblem(km, "spline.interpolation.failed");
1939
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
147 }
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
148 log.error("spline interpolation failed.", aode);
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
149 }
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
150
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
151 return new double [][] { outWs, outQs };
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
152 }
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
153
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
154 public double getQMin() {
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
155 return Math.min(splineQs[0], splineQs[splineQs.length-1]);
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
156 }
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
157
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
158 public double getQMax() {
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
159 return Math.max(splineQs[0], splineQs[splineQs.length-1]);
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
160 }
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
161
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
162 /** Constructs a continues index between the columns to Qs. */
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
163 public PolynomialSplineFunction createIndexQRelation() {
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
164
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
165 double [] indices = new double[splineQs.length];
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
166 for (int i = 0; i < indices.length; ++i) {
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
167 indices[i] = i;
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
168 }
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
169
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
170 try {
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
171 SplineInterpolator interpolator = new SplineInterpolator();
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
172 return interpolator.interpolate(indices, splineQs);
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
173 }
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
174 catch (MathIllegalArgumentException miae) {
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
175 // Ignore me!
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
176 }
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
177 return null;
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
178 }
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
179 } // class SplineFunction
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
180
1721
eb35570df0e8 Cosmetics, docs.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1681
diff changeset
181 /**
1838
853cd2120d69 Cosmetics, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1721
diff changeset
182 * A row, typically a position where measurements were taken.
1721
eb35570df0e8 Cosmetics, docs.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1681
diff changeset
183 */
633
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
184 public static final class Row
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
185 implements Serializable, Comparable<Row>
326
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
186 {
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
187 double km;
335
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
188 double [] ws;
326
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
189
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
190 public Row() {
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
191 }
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
192
335
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
193 public Row(double km) {
326
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
194 this.km = km;
335
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
195 }
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
196
633
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
197 public Row(double km, double [] ws) {
335
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
198 this(km);
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
199 this.ws = ws;
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
200 }
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
201
1838
853cd2120d69 Cosmetics, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1721
diff changeset
202 /**
853cd2120d69 Cosmetics, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1721
diff changeset
203 * Compare according to place of measurement (km).
853cd2120d69 Cosmetics, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1721
diff changeset
204 */
335
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
205 public int compareTo(Row other) {
8662
c9b8ad659d5b Use EpsilonComparator instead of redundant implementation.
"Tom Gottfried <tom@intevation.de>"
parents: 7015
diff changeset
206 return CMP.compare(km, other.km);
326
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
207 }
339
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
208
1887
d2e217f438bc Minor doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1860
diff changeset
209 /**
d2e217f438bc Minor doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1860
diff changeset
210 * Interpolate Ws, given Qs and a km.
d2e217f438bc Minor doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1860
diff changeset
211 *
d2e217f438bc Minor doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1860
diff changeset
212 * @param iqs Given ("input") Qs.
d2e217f438bc Minor doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1860
diff changeset
213 * @param ows Resulting ("output") Ws.
d2e217f438bc Minor doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1860
diff changeset
214 * @param table Table of which to use data for interpolation.
d2e217f438bc Minor doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1860
diff changeset
215 */
633
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
216 public void interpolateW(
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
217 Row other,
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
218 double km,
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
219 double [] iqs,
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
220 double [] ows,
686
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
221 WstValueTable table,
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
222 Calculation errors
633
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
223 ) {
655
913b52064449 Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 649
diff changeset
224 double kmWeight = Linear.factor(km, this.km, other.km);
339
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
225
633
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
226 QPosition qPosition = new QPosition();
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
227
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
228 for (int i = 0; i < iqs.length; ++i) {
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
229 if (table.getQPosition(km, iqs[i], qPosition) != null) {
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
230 double wt = getW(qPosition);
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
231 double wo = other.getW(qPosition);
686
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
232 if (Double.isNaN(wt) || Double.isNaN(wo)) {
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
233 if (errors != null) {
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
234 errors.addProblem(
2166
2898b1ff6013 I18N for WINFO calculation result messages.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1939
diff changeset
235 km, "cannot.find.w.for.q", iqs[i]);
686
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
236 }
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
237 ows[i] = Double.NaN;
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
238 }
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
239 else {
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
240 ows[i] = Linear.weight(kmWeight, wt, wo);
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
241 }
633
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
242 }
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
243 else {
686
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
244 if (errors != null) {
2166
2898b1ff6013 I18N for WINFO calculation result messages.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1939
diff changeset
245 errors.addProblem(km, "cannot.find.q", iqs[i]);
686
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
246 }
633
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
247 ows[i] = Double.NaN;
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
248 }
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
249 }
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
250 }
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
251
1938
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
252
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
253 public SplineFunction createSpline(
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
254 WstValueTable table,
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
255 Calculation errors
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
256 ) {
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
257 int W = ws.length;
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
258
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
259 if (W < 1) {
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
260 if (errors != null) {
2166
2898b1ff6013 I18N for WINFO calculation result messages.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1939
diff changeset
261 errors.addProblem(km, "no.ws.found");
1938
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
262 }
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
263 return null;
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
264 }
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
265
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
266 double [] splineQs = new double[W];
7000
7a7cb22395b4 Fix for flys/issue1018: Sort the pairs of (q, w) in q before creating a spline also in case of non interpolation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6923
diff changeset
267 double [] splineWs = new double[W];
1938
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
268
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
269 for (int i = 0; i < W; ++i) {
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
270 double sq = table.getQIndex(i, km);
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
271 if (Double.isNaN(sq) && errors != null) {
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
272 errors.addProblem(
2166
2898b1ff6013 I18N for WINFO calculation result messages.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1939
diff changeset
273 km, "no.q.found.in.column", (i+1));
1938
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
274 }
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
275 splineQs[i] = sq;
7000
7a7cb22395b4 Fix for flys/issue1018: Sort the pairs of (q, w) in q before creating a spline also in case of non interpolation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6923
diff changeset
276 splineWs[i] = ws[i];
1938
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
277 }
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
278
7000
7a7cb22395b4 Fix for flys/issue1018: Sort the pairs of (q, w) in q before creating a spline also in case of non interpolation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6923
diff changeset
279 DoubleUtil.sortByFirst(splineQs, splineWs);
7a7cb22395b4 Fix for flys/issue1018: Sort the pairs of (q, w) in q before creating a spline also in case of non interpolation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6923
diff changeset
280
1938
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
281 try {
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
282 SplineInterpolator interpolator = new SplineInterpolator();
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
283 PolynomialSplineFunction spline =
7000
7a7cb22395b4 Fix for flys/issue1018: Sort the pairs of (q, w) in q before creating a spline also in case of non interpolation.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6923
diff changeset
284 interpolator.interpolate(splineQs, splineWs);
1938
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
285
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
286 return new SplineFunction(spline, splineQs, ws);
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
287 }
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
288 catch (MathIllegalArgumentException miae) {
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
289 if (errors != null) {
2166
2898b1ff6013 I18N for WINFO calculation result messages.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1939
diff changeset
290 errors.addProblem(km, "spline.creation.failed");
1938
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
291 }
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
292 log.error("spline creation failed", miae);
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
293 }
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
294 return null;
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
295 }
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
296
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
297 public SplineFunction createSpline(
633
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
298 Row other,
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
299 double km,
686
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
300 WstValueTable table,
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
301 Calculation errors
633
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
302 ) {
395
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
303 int W = Math.min(ws.length, other.ws.length);
339
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
304
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
305 if (W < 1) {
686
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
306 if (errors != null) {
2166
2898b1ff6013 I18N for WINFO calculation result messages.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1939
diff changeset
307 errors.addProblem("no.ws.found");
686
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
308 }
1938
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
309 return null;
339
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
310 }
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
311
655
913b52064449 Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 649
diff changeset
312 double factor = Linear.factor(km, this.km, other.km);
339
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
313
1938
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
314 double [] splineQs = new double[W];
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
315 double [] splineWs = new double[W];
339
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
316
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
317 for (int i = 0; i < W; ++i) {
655
913b52064449 Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 649
diff changeset
318 double wws = Linear.weight(factor, ws[i], other.ws[i]);
913b52064449 Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 649
diff changeset
319 double wqs = Linear.weight(
633
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
320 factor,
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
321 table.getQIndex(i, km),
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
322 table.getQIndex(i, other.km));
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
323
686
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
324 if (Double.isNaN(wws) || Double.isNaN(wqs)) {
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
325 if (errors != null) {
2166
2898b1ff6013 I18N for WINFO calculation result messages.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1939
diff changeset
326 errors.addProblem(km, "cannot.find.w.or.q");
686
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
327 }
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
328 }
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
329
1938
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
330 splineWs[i] = wws;
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
331 splineQs[i] = wqs;
339
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
332 }
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
333
6434
898afcce1d0a Partial fix for flys/1303
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5994
diff changeset
334 DoubleUtil.sortByFirst(splineQs, splineWs);
898afcce1d0a Partial fix for flys/1303
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5994
diff changeset
335
339
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
336 SplineInterpolator interpolator = new SplineInterpolator();
686
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
337
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
338 try {
1938
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
339 PolynomialSplineFunction spline =
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
340 interpolator.interpolate(splineQs, splineWs);
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
341
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
342 return new SplineFunction(spline, splineQs, splineWs);
686
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
343 }
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
344 catch (MathIllegalArgumentException miae) {
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
345 if (errors != null) {
2166
2898b1ff6013 I18N for WINFO calculation result messages.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1939
diff changeset
346 errors.addProblem(km, "spline.creation.failed");
686
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
347 }
1860
ddd425858169 Improved logging to include exception in fail case of spline interpolation of wst.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1838
diff changeset
348 log.error("spline creation failed", miae);
686
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
349 }
339
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
350
1938
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
351 return null;
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
352 }
686
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
353
1938
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
354 public double [][] interpolateWQ(
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
355 Row other,
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
356 double km,
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
357 int steps,
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
358 WstValueTable table,
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
359 Calculation errors
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
360 ) {
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
361 SplineFunction sf = createSpline(other, km, table, errors);
339
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
362
1938
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
363 return sf != null
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
364 ? sf.sample(steps, km, errors)
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
365 : new double[2][0];
339
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
366 }
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
367
1721
eb35570df0e8 Cosmetics, docs.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1681
diff changeset
368
686
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
369 public double [][] interpolateWQ(
742
c09c9e05ecfa Removed trailing whitespace.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 704
diff changeset
370 int steps,
686
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
371 WstValueTable table,
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
372 Calculation errors
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
373 ) {
1938
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
374 SplineFunction sf = createSpline(table, errors);
339
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
375
1938
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
376 return sf != null
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
377 ? sf.sample(steps, km, errors)
1d991c91285b Refactored the code of the 'berechnete Abflusskurve' to be reusable in the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1937
diff changeset
378 : new double[2][0];
339
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
379 }
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
380
426
c6b7ca0febcb Fix step to fix issue69: Do the right calculation
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 395
diff changeset
381
633
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
382 public double getW(QPosition qPosition) {
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
383 int index = qPosition.index;
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
384 double weight = qPosition.weight;
426
c6b7ca0febcb Fix step to fix issue69: Do the right calculation
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 395
diff changeset
385
633
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
386 return weight == 1.0
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
387 ? ws[index]
655
913b52064449 Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 649
diff changeset
388 : Linear.weight(weight, ws[index-1], ws[index]);
426
c6b7ca0febcb Fix step to fix issue69: Do the right calculation
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 395
diff changeset
389 }
c6b7ca0febcb Fix step to fix issue69: Do the right calculation
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 395
diff changeset
390
633
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
391 public double getW(
426
c6b7ca0febcb Fix step to fix issue69: Do the right calculation
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 395
diff changeset
392 Row other,
c6b7ca0febcb Fix step to fix issue69: Do the right calculation
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 395
diff changeset
393 double km,
633
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
394 QPosition qPosition
426
c6b7ca0febcb Fix step to fix issue69: Do the right calculation
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 395
diff changeset
395 ) {
655
913b52064449 Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 649
diff changeset
396 double kmWeight = Linear.factor(km, this.km, other.km);
426
c6b7ca0febcb Fix step to fix issue69: Do the right calculation
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 395
diff changeset
397
633
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
398 int index = qPosition.index;
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
399 double weight = qPosition.weight;
426
c6b7ca0febcb Fix step to fix issue69: Do the right calculation
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 395
diff changeset
400
633
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
401 double tw, ow;
426
c6b7ca0febcb Fix step to fix issue69: Do the right calculation
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 395
diff changeset
402
633
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
403 if (weight == 1.0) {
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
404 tw = ws[index];
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
405 ow = other.ws[index];
426
c6b7ca0febcb Fix step to fix issue69: Do the right calculation
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 395
diff changeset
406 }
c6b7ca0febcb Fix step to fix issue69: Do the right calculation
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 395
diff changeset
407 else {
742
c09c9e05ecfa Removed trailing whitespace.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 704
diff changeset
408 tw = Linear.weight(weight, ws[index-1], ws[index]);
c09c9e05ecfa Removed trailing whitespace.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 704
diff changeset
409 ow = Linear.weight(weight, other.ws[index-1], other.ws[index]);
426
c6b7ca0febcb Fix step to fix issue69: Do the right calculation
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 395
diff changeset
410 }
c6b7ca0febcb Fix step to fix issue69: Do the right calculation
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 395
diff changeset
411
655
913b52064449 Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 649
diff changeset
412 return Linear.weight(kmWeight, tw, ow);
427
909196be11a0 First step to calculate "W fuer ungleichwertige Abfluesse" correctly. flys/issue55
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 426
diff changeset
413 }
1937
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
414
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
415 public double [] findQsForW(double w, WstValueTable table) {
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
416
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
417 TDoubleArrayList qs = new TDoubleArrayList();
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
418
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
419 if (ws.length > 0 && Math.abs(ws[0]-w) < 0.000001) {
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
420 double q = table.getQIndex(0, km);
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
421 if (!Double.isNaN(q)) {
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
422 qs.add(q);
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
423 }
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
424 }
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
425
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
426 for (int i = 1; i < ws.length; ++i) {
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
427 double w2 = ws[i];
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
428 if (Double.isNaN(w2)) {
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
429 continue;
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
430 }
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
431 if (Math.abs(w2-w) < 0.000001) {
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
432 double q = table.getQIndex(i, km);
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
433 if (!Double.isNaN(q)) {
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
434 qs.add(q);
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
435 }
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
436 continue;
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
437 }
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
438 double w1 = ws[i-1];
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
439 if (Double.isNaN(w1)) {
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
440 continue;
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
441 }
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
442
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
443 if (w < Math.min(w1, w2) || w > Math.max(w1, w2)) {
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
444 continue;
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
445 }
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
446
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
447 double q1 = table.getQIndex(i-1, km);
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
448 double q2 = table.getQIndex(i, km);
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
449 if (Double.isNaN(q1) || Double.isNaN(q2)) {
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
450 continue;
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
451 }
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
452
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
453 double q = Linear.linear(w, w1, w2, q1, q2);
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
454 qs.add(q);
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
455 }
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
456
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
457 return qs.toNativeArray();
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
458 }
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
459
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
460 public double [] findQsForW(
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
461 Row other,
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
462 double w,
3076
5642a83420f2 FLYS artifacts: Removed trailing whitespace.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2560
diff changeset
463 double km,
1937
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
464 WstValueTable table
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
465 ) {
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
466 TDoubleArrayList qs = new TDoubleArrayList();
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
467
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
468 double factor = Linear.factor(km, this.km, other.km);
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
469
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
470 if (ws.length > 0) {
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
471 double wt = Linear.weight(factor, ws[0], other.ws[0]);
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
472 if (!Double.isNaN(wt)) {
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
473 double q = table.getQIndex(0, km);
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
474 if (!Double.isNaN(q)) {
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
475 qs.add(q);
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
476 }
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
477 }
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
478 }
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
479
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
480 for (int i = 1; i < ws.length; ++i) {
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
481 double w2 = Linear.weight(factor, ws[i], other.ws[i]);
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
482 if (Double.isNaN(w2)) {
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
483 continue;
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
484 }
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
485 if (Math.abs(w2-w) < 0.000001) {
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
486 double q = table.getQIndex(i, km);
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
487 if (!Double.isNaN(q)) {
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
488 qs.add(q);
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
489 }
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
490 continue;
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
491 }
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
492 double w1 = Linear.weight(factor, ws[i-1], other.ws[i-1]);
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
493 if (Double.isNaN(w1)) {
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
494 continue;
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
495 }
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
496
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
497 if (w < Math.min(w1, w2) || w > Math.max(w1, w2)) {
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
498 continue;
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
499 }
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
500
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
501 double q1 = table.getQIndex(i-1, km);
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
502 double q2 = table.getQIndex(i, km);
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
503 if (Double.isNaN(q1) || Double.isNaN(q2)) {
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
504 continue;
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
505 }
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
506
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
507 double q = Linear.linear(w, w1, w2, q1, q2);
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
508 qs.add(q);
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
509 }
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
510
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
511 return qs.toNativeArray();
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
512 }
2423
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
513
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
514 public double [] getMinMaxW(double [] result) {
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
515 double minW = Double.MAX_VALUE;
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
516 double maxW = -Double.MAX_VALUE;
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
517 for (int i = 0; i < ws.length; ++i) {
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
518 double w = ws[i];
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
519 if (w < minW) minW = w;
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
520 if (w > maxW) maxW = w;
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
521 }
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
522 result[0] = minW;
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
523 result[1] = maxW;
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
524 return result;
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
525 }
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
526
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
527 public double [] getMinMaxW(Row other, double km, double [] result) {
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
528 double [] m1 = this .getMinMaxW(new double [2]);
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
529 double [] m2 = other.getMinMaxW(new double [2]);
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
530 double factor = Linear.factor(km, this.km, other.km);
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
531 result[0] = Linear.weight(factor, m1[0], m2[0]);
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
532 result[1] = Linear.weight(factor, m1[1], m2[1]);
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
533 return result;
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
534 }
633
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
535 } // class Row
326
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
536
1838
853cd2120d69 Cosmetics, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1721
diff changeset
537 /** Rows in table. */
326
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
538 protected List<Row> rows;
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
539
1838
853cd2120d69 Cosmetics, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1721
diff changeset
540 /** Columns in table. */
326
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
541 protected Column [] columns;
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
542
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
543 public WstValueTable() {
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
544 rows = new ArrayList<Row>();
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
545 }
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
546
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
547 public WstValueTable(Column [] columns) {
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
548 this();
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
549 this.columns = columns;
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
550 }
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
551
633
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
552 public WstValueTable(Column [] columns, List<Row> rows) {
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
553 this.columns = columns;
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
554 this.rows = rows;
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
555 }
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
556
4797
43e69af28b3c A naive algorithm to figure out the "Umhuellende" of a set of WQKms.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4119
diff changeset
557 public Column [] getColumns() {
43e69af28b3c A naive algorithm to figure out the "Umhuellende" of a set of WQKms.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4119
diff changeset
558 return columns;
43e69af28b3c A naive algorithm to figure out the "Umhuellende" of a set of WQKms.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4119
diff changeset
559 }
43e69af28b3c A naive algorithm to figure out the "Umhuellende" of a set of WQKms.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4119
diff changeset
560
1838
853cd2120d69 Cosmetics, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1721
diff changeset
561 /** Sort rows (by km). */
458
523a256451cd Use unsharp km lookup (epsilon = 0.0001).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 443
diff changeset
562 public void sortRows() {
523a256451cd Use unsharp km lookup (epsilon = 0.0001).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 443
diff changeset
563 Collections.sort(rows);
523a256451cd Use unsharp km lookup (epsilon = 0.0001).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 443
diff changeset
564 }
523a256451cd Use unsharp km lookup (epsilon = 0.0001).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 443
diff changeset
565
1887
d2e217f438bc Minor doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1860
diff changeset
566 /**
d2e217f438bc Minor doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1860
diff changeset
567 * @param km Given kilometer.
d2e217f438bc Minor doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1860
diff changeset
568 * @param qs Given Q values.
d2e217f438bc Minor doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1860
diff changeset
569 * @param ws output parameter.
d2e217f438bc Minor doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1860
diff changeset
570 */
380
5f55047a17e8 Moved expensive allocation of result arrays out of km loop.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 374
diff changeset
571 public double [] interpolateW(double km, double [] qs, double [] ws) {
686
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
572 return interpolateW(km, qs, ws, null);
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
573 }
335
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
574
1098
1ea7eb72aaa6 Minor cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 742
diff changeset
575
1ea7eb72aaa6 Minor cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 742
diff changeset
576 /**
1ea7eb72aaa6 Minor cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 742
diff changeset
577 * @param ws (output parameter), gets returned.
1ea7eb72aaa6 Minor cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 742
diff changeset
578 * @return output parameter ws.
1ea7eb72aaa6 Minor cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 742
diff changeset
579 */
686
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
580 public double [] interpolateW(
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
581 double km,
742
c09c9e05ecfa Removed trailing whitespace.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 704
diff changeset
582 double [] qs,
686
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
583 double [] ws,
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
584 Calculation errors
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
585 ) {
335
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
586 int rowIndex = Collections.binarySearch(rows, new Row(km));
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
587
633
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
588 QPosition qPosition = new QPosition();
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
589
335
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
590 if (rowIndex >= 0) { // direct row match
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
591 Row row = rows.get(rowIndex);
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
592 for (int i = 0; i < qs.length; ++i) {
686
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
593 if (getQPosition(km, qs[i], qPosition) == null) {
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
594 if (errors != null) {
2166
2898b1ff6013 I18N for WINFO calculation result messages.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1939
diff changeset
595 errors.addProblem(km, "cannot.find.q", qs[i]);
686
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
596 }
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
597 ws[i] = Double.NaN;
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
598 }
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
599 else {
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
600 if (Double.isNaN(ws[i] = row.getW(qPosition))
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
601 && errors != null) {
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
602 errors.addProblem(
2166
2898b1ff6013 I18N for WINFO calculation result messages.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1939
diff changeset
603 km, "cannot.find.w.for.q", qs[i]);
686
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
604 }
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
605 }
335
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
606 }
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
607 }
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
608 else { // needs bilinear interpolation
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
609 rowIndex = -rowIndex -1;
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
610
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
611 if (rowIndex < 1 || rowIndex >= rows.size()) {
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
612 // do not extrapolate
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
613 Arrays.fill(ws, Double.NaN);
686
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
614 if (errors != null) {
2166
2898b1ff6013 I18N for WINFO calculation result messages.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1939
diff changeset
615 errors.addProblem(km, "km.not.found");
686
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
616 }
335
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
617 }
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
618 else {
633
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
619 Row r1 = rows.get(rowIndex-1);
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
620 Row r2 = rows.get(rowIndex);
686
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
621 r1.interpolateW(r2, km, qs, ws, this, errors);
335
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
622 }
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
623 }
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
624
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
625 return ws;
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
626 }
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
627
2559
407bbc74fe0b WstValueTable: Symmetrical to getMinMaxW() add two methods to find min/max Q for a given
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2558
diff changeset
628 public double [] getMinMaxQ(double km) {
407bbc74fe0b WstValueTable: Symmetrical to getMinMaxW() add two methods to find min/max Q for a given
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2558
diff changeset
629 return getMinMaxQ(km, new double [2]);
407bbc74fe0b WstValueTable: Symmetrical to getMinMaxW() add two methods to find min/max Q for a given
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2558
diff changeset
630 }
407bbc74fe0b WstValueTable: Symmetrical to getMinMaxW() add two methods to find min/max Q for a given
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2558
diff changeset
631
407bbc74fe0b WstValueTable: Symmetrical to getMinMaxW() add two methods to find min/max Q for a given
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2558
diff changeset
632 public double [] getMinMaxQ(double km, double [] result) {
407bbc74fe0b WstValueTable: Symmetrical to getMinMaxW() add two methods to find min/max Q for a given
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2558
diff changeset
633 double minQ = Double.MAX_VALUE;
407bbc74fe0b WstValueTable: Symmetrical to getMinMaxW() add two methods to find min/max Q for a given
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2558
diff changeset
634 double maxQ = -Double.MAX_VALUE;
407bbc74fe0b WstValueTable: Symmetrical to getMinMaxW() add two methods to find min/max Q for a given
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2558
diff changeset
635
407bbc74fe0b WstValueTable: Symmetrical to getMinMaxW() add two methods to find min/max Q for a given
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2558
diff changeset
636 for (int i = 0; i < columns.length; ++i) {
407bbc74fe0b WstValueTable: Symmetrical to getMinMaxW() add two methods to find min/max Q for a given
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2558
diff changeset
637 double q = columns[i].getQRangeTree().findQ(km);
407bbc74fe0b WstValueTable: Symmetrical to getMinMaxW() add two methods to find min/max Q for a given
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2558
diff changeset
638 if (!Double.isNaN(q)) {
407bbc74fe0b WstValueTable: Symmetrical to getMinMaxW() add two methods to find min/max Q for a given
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2558
diff changeset
639 if (q < minQ) minQ = q;
407bbc74fe0b WstValueTable: Symmetrical to getMinMaxW() add two methods to find min/max Q for a given
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2558
diff changeset
640 if (q > maxQ) maxQ = q;
407bbc74fe0b WstValueTable: Symmetrical to getMinMaxW() add two methods to find min/max Q for a given
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2558
diff changeset
641 }
407bbc74fe0b WstValueTable: Symmetrical to getMinMaxW() add two methods to find min/max Q for a given
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2558
diff changeset
642 }
407bbc74fe0b WstValueTable: Symmetrical to getMinMaxW() add two methods to find min/max Q for a given
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2558
diff changeset
643
407bbc74fe0b WstValueTable: Symmetrical to getMinMaxW() add two methods to find min/max Q for a given
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2558
diff changeset
644 if (minQ < Double.MAX_VALUE) {
407bbc74fe0b WstValueTable: Symmetrical to getMinMaxW() add two methods to find min/max Q for a given
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2558
diff changeset
645 result[0] = minQ;
407bbc74fe0b WstValueTable: Symmetrical to getMinMaxW() add two methods to find min/max Q for a given
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2558
diff changeset
646 result[1] = maxQ;
407bbc74fe0b WstValueTable: Symmetrical to getMinMaxW() add two methods to find min/max Q for a given
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2558
diff changeset
647 return result;
407bbc74fe0b WstValueTable: Symmetrical to getMinMaxW() add two methods to find min/max Q for a given
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2558
diff changeset
648 }
407bbc74fe0b WstValueTable: Symmetrical to getMinMaxW() add two methods to find min/max Q for a given
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2558
diff changeset
649
407bbc74fe0b WstValueTable: Symmetrical to getMinMaxW() add two methods to find min/max Q for a given
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2558
diff changeset
650 return null;
407bbc74fe0b WstValueTable: Symmetrical to getMinMaxW() add two methods to find min/max Q for a given
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2558
diff changeset
651 }
407bbc74fe0b WstValueTable: Symmetrical to getMinMaxW() add two methods to find min/max Q for a given
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2558
diff changeset
652
2560
0d8c97374dc9 WstValueTable: Forget to check in the range method of getMinMaxQ().
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2559
diff changeset
653 public double [] getMinMaxQ(double from, double to, double step) {
0d8c97374dc9 WstValueTable: Forget to check in the range method of getMinMaxQ().
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2559
diff changeset
654 double [] result = new double[2];
0d8c97374dc9 WstValueTable: Forget to check in the range method of getMinMaxQ().
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2559
diff changeset
655
0d8c97374dc9 WstValueTable: Forget to check in the range method of getMinMaxQ().
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2559
diff changeset
656 double minQ = Double.MAX_VALUE;
0d8c97374dc9 WstValueTable: Forget to check in the range method of getMinMaxQ().
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2559
diff changeset
657 double maxQ = -Double.MAX_VALUE;
0d8c97374dc9 WstValueTable: Forget to check in the range method of getMinMaxQ().
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2559
diff changeset
658
0d8c97374dc9 WstValueTable: Forget to check in the range method of getMinMaxQ().
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2559
diff changeset
659 if (from > to) {
0d8c97374dc9 WstValueTable: Forget to check in the range method of getMinMaxQ().
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2559
diff changeset
660 double tmp = from;
0d8c97374dc9 WstValueTable: Forget to check in the range method of getMinMaxQ().
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2559
diff changeset
661 from = to;
0d8c97374dc9 WstValueTable: Forget to check in the range method of getMinMaxQ().
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2559
diff changeset
662 to = tmp;
0d8c97374dc9 WstValueTable: Forget to check in the range method of getMinMaxQ().
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2559
diff changeset
663 }
0d8c97374dc9 WstValueTable: Forget to check in the range method of getMinMaxQ().
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2559
diff changeset
664
0d8c97374dc9 WstValueTable: Forget to check in the range method of getMinMaxQ().
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2559
diff changeset
665 step = Math.max(Math.abs(step), 0.0001);
0d8c97374dc9 WstValueTable: Forget to check in the range method of getMinMaxQ().
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2559
diff changeset
666
0d8c97374dc9 WstValueTable: Forget to check in the range method of getMinMaxQ().
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2559
diff changeset
667 double d = from;
0d8c97374dc9 WstValueTable: Forget to check in the range method of getMinMaxQ().
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2559
diff changeset
668 for (; d <= to; d += step) {
0d8c97374dc9 WstValueTable: Forget to check in the range method of getMinMaxQ().
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2559
diff changeset
669 if (getMinMaxQ(d, result) != null) {
0d8c97374dc9 WstValueTable: Forget to check in the range method of getMinMaxQ().
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2559
diff changeset
670 if (result[0] < minQ) minQ = result[0];
0d8c97374dc9 WstValueTable: Forget to check in the range method of getMinMaxQ().
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2559
diff changeset
671 if (result[1] > maxQ) maxQ = result[1];
0d8c97374dc9 WstValueTable: Forget to check in the range method of getMinMaxQ().
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2559
diff changeset
672 }
0d8c97374dc9 WstValueTable: Forget to check in the range method of getMinMaxQ().
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2559
diff changeset
673 }
0d8c97374dc9 WstValueTable: Forget to check in the range method of getMinMaxQ().
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2559
diff changeset
674
0d8c97374dc9 WstValueTable: Forget to check in the range method of getMinMaxQ().
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2559
diff changeset
675 if (d != to) {
0d8c97374dc9 WstValueTable: Forget to check in the range method of getMinMaxQ().
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2559
diff changeset
676 if (getMinMaxQ(to, result) != null) {
0d8c97374dc9 WstValueTable: Forget to check in the range method of getMinMaxQ().
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2559
diff changeset
677 if (result[0] < minQ) minQ = result[0];
0d8c97374dc9 WstValueTable: Forget to check in the range method of getMinMaxQ().
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2559
diff changeset
678 if (result[1] > maxQ) maxQ = result[1];
0d8c97374dc9 WstValueTable: Forget to check in the range method of getMinMaxQ().
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2559
diff changeset
679 }
0d8c97374dc9 WstValueTable: Forget to check in the range method of getMinMaxQ().
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2559
diff changeset
680 }
0d8c97374dc9 WstValueTable: Forget to check in the range method of getMinMaxQ().
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2559
diff changeset
681
0d8c97374dc9 WstValueTable: Forget to check in the range method of getMinMaxQ().
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2559
diff changeset
682 return minQ < Double.MAX_VALUE
0d8c97374dc9 WstValueTable: Forget to check in the range method of getMinMaxQ().
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2559
diff changeset
683 ? new double [] { minQ, maxQ }
0d8c97374dc9 WstValueTable: Forget to check in the range method of getMinMaxQ().
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2559
diff changeset
684 : null;
0d8c97374dc9 WstValueTable: Forget to check in the range method of getMinMaxQ().
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2559
diff changeset
685 }
2559
407bbc74fe0b WstValueTable: Symmetrical to getMinMaxW() add two methods to find min/max Q for a given
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2558
diff changeset
686
2423
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
687 public double [] getMinMaxW(double km) {
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
688 return getMinMaxW(km, new double [2]);
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
689
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
690 }
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
691 public double [] getMinMaxW(double km, double [] result) {
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
692 int rowIndex = Collections.binarySearch(rows, new Row(km));
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
693
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
694 if (rowIndex >= 0) {
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
695 return rows.get(rowIndex).getMinMaxW(result);
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
696 }
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
697
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
698 rowIndex = -rowIndex -1;
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
699
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
700 if (rowIndex < 1 || rowIndex >= rows.size()) {
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
701 // do not extrapolate
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
702 return null;
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
703 }
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
704
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
705 Row r1 = rows.get(rowIndex-1);
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
706 Row r2 = rows.get(rowIndex);
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
707
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
708 return r1.getMinMaxW(r2, km, result);
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
709 }
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
710
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
711 public double [] getMinMaxW(double from, double to, double step) {
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
712 double [] result = new double[2];
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
713
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
714 double minW = Double.MAX_VALUE;
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
715 double maxW = -Double.MAX_VALUE;
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
716
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
717 if (from > to) {
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
718 double tmp = from;
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
719 from = to;
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
720 to = tmp;
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
721 }
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
722
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
723 step = Math.max(Math.abs(step), 0.0001);
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
724
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
725 double d = from;
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
726 for (; d <= to; d += step) {
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
727 if (getMinMaxW(d, result) != null) {
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
728 if (result[0] < minW) minW = result[0];
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
729 if (result[1] > maxW) maxW = result[1];
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
730 }
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
731 }
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
732
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
733 if (d != to) {
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
734 if (getMinMaxW(to, result) != null) {
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
735 if (result[0] < minW) minW = result[0];
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
736 if (result[1] > maxW) maxW = result[1];
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
737 }
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
738 }
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
739
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
740 return minW < Double.MAX_VALUE
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
741 ? new double [] { minW, maxW }
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
742 : null;
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
743 }
ac528b883b47 Picked rev 4070,4074,4076,4080 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2404
diff changeset
744
1838
853cd2120d69 Cosmetics, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1721
diff changeset
745 /**
853cd2120d69 Cosmetics, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1721
diff changeset
746 * Interpolate W and Q values at a given km.
853cd2120d69 Cosmetics, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1721
diff changeset
747 */
339
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
748 public double [][] interpolateWQ(double km) {
686
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
749 return interpolateWQ(km, null);
339
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
750 }
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
751
1838
853cd2120d69 Cosmetics, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1721
diff changeset
752 /**
853cd2120d69 Cosmetics, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1721
diff changeset
753 * Interpolate W and Q values at a given km.
3265
c1f445b94d03 Cosmetics, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 3076
diff changeset
754 *
c1f445b94d03 Cosmetics, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 3076
diff changeset
755 * @param errors where to store errors.
c1f445b94d03 Cosmetics, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 3076
diff changeset
756 *
c1f445b94d03 Cosmetics, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 3076
diff changeset
757 * @return double double array, first index Ws, second Qs.
1838
853cd2120d69 Cosmetics, doc.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1721
diff changeset
758 */
686
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
759 public double [][] interpolateWQ(double km, Calculation errors) {
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
760 return interpolateWQ(km, DEFAULT_Q_STEPS, errors);
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
761 }
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
762
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
763
1860
ddd425858169 Improved logging to include exception in fail case of spline interpolation of wst.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1838
diff changeset
764 /**
ddd425858169 Improved logging to include exception in fail case of spline interpolation of wst.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1838
diff changeset
765 * Interpolate W and Q values at a given km.
ddd425858169 Improved logging to include exception in fail case of spline interpolation of wst.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1838
diff changeset
766 */
686
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
767 public double [][] interpolateWQ(double km, int steps, Calculation errors) {
395
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
768
339
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
769 int rowIndex = Collections.binarySearch(rows, new Row(km));
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
770
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
771 if (rowIndex >= 0) { // direct row match
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
772 Row row = rows.get(rowIndex);
686
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
773 return row.interpolateWQ(steps, this, errors);
339
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
774 }
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
775
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
776 rowIndex = -rowIndex -1;
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
777
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
778 if (rowIndex < 1 || rowIndex >= rows.size()) {
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
779 // do not extrapolate
686
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
780 if (errors != null) {
2166
2898b1ff6013 I18N for WINFO calculation result messages.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1939
diff changeset
781 errors.addProblem(km, "km.not.found");
686
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
782 }
339
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
783 return new double[2][0];
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
784 }
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
785
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
786 Row r1 = rows.get(rowIndex-1);
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
787 Row r2 = rows.get(rowIndex);
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
788
686
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
789 return r1.interpolateWQ(r2, km, steps, this, errors);
339
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
790 }
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
791
655
913b52064449 Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 649
diff changeset
792 public boolean interpolate(
913b52064449 Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 649
diff changeset
793 double km,
913b52064449 Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 649
diff changeset
794 double [] out,
913b52064449 Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 649
diff changeset
795 QPosition qPosition,
913b52064449 Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 649
diff changeset
796 Function qFunction
649
44175d4720f8 Fix crashes in back jump correction.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 645
diff changeset
797 ) {
427
909196be11a0 First step to calculate "W fuer ungleichwertige Abfluesse" correctly. flys/issue55
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 426
diff changeset
798 int R1 = rows.size()-1;
909196be11a0 First step to calculate "W fuer ungleichwertige Abfluesse" correctly. flys/issue55
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 426
diff changeset
799
655
913b52064449 Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 649
diff changeset
800 out[1] = qFunction.value(getQ(qPosition, km));
913b52064449 Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 649
diff changeset
801
913b52064449 Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 649
diff changeset
802 if (Double.isNaN(out[1])) {
913b52064449 Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 649
diff changeset
803 return false;
913b52064449 Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 649
diff changeset
804 }
633
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
805
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
806 QPosition nPosition = new QPosition();
655
913b52064449 Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 649
diff changeset
807 if (getQPosition(km, out[1], nPosition) == null) {
913b52064449 Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 649
diff changeset
808 return false;
913b52064449 Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 649
diff changeset
809 }
427
909196be11a0 First step to calculate "W fuer ungleichwertige Abfluesse" correctly. flys/issue55
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 426
diff changeset
810
655
913b52064449 Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 649
diff changeset
811 int rowIndex = Collections.binarySearch(rows, new Row(km));
427
909196be11a0 First step to calculate "W fuer ungleichwertige Abfluesse" correctly. flys/issue55
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 426
diff changeset
812
655
913b52064449 Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 649
diff changeset
813 if (rowIndex >= 0) {
913b52064449 Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 649
diff changeset
814 // direct row match
913b52064449 Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 649
diff changeset
815 out[0] = rows.get(rowIndex).getW(nPosition);
913b52064449 Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 649
diff changeset
816 return !Double.isNaN(out[0]);
427
909196be11a0 First step to calculate "W fuer ungleichwertige Abfluesse" correctly. flys/issue55
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 426
diff changeset
817 }
655
913b52064449 Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 649
diff changeset
818
913b52064449 Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 649
diff changeset
819 rowIndex = -rowIndex -1;
913b52064449 Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 649
diff changeset
820
1681
e5f7f25a511c fixed flys/issue201
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1098
diff changeset
821 if (rowIndex < 1 || rowIndex > R1) {
655
913b52064449 Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 649
diff changeset
822 // do not extrapolate
913b52064449 Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 649
diff changeset
823 return false;
913b52064449 Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 649
diff changeset
824 }
913b52064449 Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 649
diff changeset
825
913b52064449 Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 649
diff changeset
826 Row r1 = rows.get(rowIndex-1);
913b52064449 Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 649
diff changeset
827 Row r2 = rows.get(rowIndex);
913b52064449 Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 649
diff changeset
828 out[0] = r1.getW(r2, km, nPosition);
913b52064449 Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 649
diff changeset
829
913b52064449 Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 649
diff changeset
830 return !Double.isNaN(out[0]);
427
909196be11a0 First step to calculate "W fuer ungleichwertige Abfluesse" correctly. flys/issue55
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 426
diff changeset
831 }
909196be11a0 First step to calculate "W fuer ungleichwertige Abfluesse" correctly. flys/issue55
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 426
diff changeset
832
1098
1ea7eb72aaa6 Minor cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 742
diff changeset
833
1ea7eb72aaa6 Minor cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 742
diff changeset
834 /**
1ea7eb72aaa6 Minor cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 742
diff changeset
835 * Look up interpolation of a Q at given positions.
1ea7eb72aaa6 Minor cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 742
diff changeset
836 *
1ea7eb72aaa6 Minor cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 742
diff changeset
837 * @param q the non-interpolated Q value.
1ea7eb72aaa6 Minor cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 742
diff changeset
838 * @param referenceKm the reference km (e.g. gauge position).
1ea7eb72aaa6 Minor cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 742
diff changeset
839 * @param kms positions for which to interpolate.
1ea7eb72aaa6 Minor cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 742
diff changeset
840 * @param ws (output) resulting interpolated ws.
1ea7eb72aaa6 Minor cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 742
diff changeset
841 * @param qs (output) resulting interpolated qs.
1ea7eb72aaa6 Minor cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 742
diff changeset
842 * @param errors calculation object to store errors.
1ea7eb72aaa6 Minor cosmetics.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 742
diff changeset
843 */
427
909196be11a0 First step to calculate "W fuer ungleichwertige Abfluesse" correctly. flys/issue55
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 426
diff changeset
844 public QPosition interpolate(
686
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
845 double q,
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
846 double referenceKm,
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
847 double [] kms,
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
848 double [] ws,
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
849 double [] qs,
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
850 Calculation errors
426
c6b7ca0febcb Fix step to fix issue69: Do the right calculation
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 395
diff changeset
851 ) {
686
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
852 return interpolate(
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
853 q, referenceKm, kms, ws, qs, 0, kms.length, errors);
649
44175d4720f8 Fix crashes in back jump correction.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 645
diff changeset
854 }
44175d4720f8 Fix crashes in back jump correction.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 645
diff changeset
855
6711
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6434
diff changeset
856 /**
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6434
diff changeset
857 * Interpolate Q at given positions.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6434
diff changeset
858 * @param kms positions for which to calculate qs and ws
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6434
diff changeset
859 * @param ws [out] calculated ws for kms
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6434
diff changeset
860 * @param qs [out] looked up qs for kms.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6434
diff changeset
861 */
649
44175d4720f8 Fix crashes in back jump correction.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 645
diff changeset
862 public QPosition interpolate(
686
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
863 double q,
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
864 double referenceKm,
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
865 double [] kms,
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
866 double [] ws,
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
867 double [] qs,
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
868 int startIndex,
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
869 int length,
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
870 Calculation errors
649
44175d4720f8 Fix crashes in back jump correction.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 645
diff changeset
871 ) {
645
433f67a076aa Use an explicit reference km for interpolation now.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 633
diff changeset
872 QPosition qPosition = getQPosition(referenceKm, q);
426
c6b7ca0febcb Fix step to fix issue69: Do the right calculation
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 395
diff changeset
873
c6b7ca0febcb Fix step to fix issue69: Do the right calculation
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 395
diff changeset
874 if (qPosition == null) {
633
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
875 // we cannot locate q at km
686
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
876 Arrays.fill(ws, Double.NaN);
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
877 Arrays.fill(qs, Double.NaN);
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
878 if (errors != null) {
2166
2898b1ff6013 I18N for WINFO calculation result messages.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1939
diff changeset
879 errors.addProblem(referenceKm, "cannot.find.q", q);
686
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
880 }
427
909196be11a0 First step to calculate "W fuer ungleichwertige Abfluesse" correctly. flys/issue55
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 426
diff changeset
881 return null;
426
c6b7ca0febcb Fix step to fix issue69: Do the right calculation
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 395
diff changeset
882 }
c6b7ca0febcb Fix step to fix issue69: Do the right calculation
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 395
diff changeset
883
645
433f67a076aa Use an explicit reference km for interpolation now.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 633
diff changeset
884 Row kmKey = new Row();
433f67a076aa Use an explicit reference km for interpolation now.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 633
diff changeset
885
433f67a076aa Use an explicit reference km for interpolation now.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 633
diff changeset
886 int R1 = rows.size()-1;
433f67a076aa Use an explicit reference km for interpolation now.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 633
diff changeset
887
649
44175d4720f8 Fix crashes in back jump correction.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 645
diff changeset
888 for (int i = startIndex, end = startIndex+length; i < end; ++i) {
458
523a256451cd Use unsharp km lookup (epsilon = 0.0001).
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 443
diff changeset
889
686
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
890 if (Double.isNaN(qs[i] = getQ(qPosition, kms[i]))) {
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
891 if (errors != null) {
2166
2898b1ff6013 I18N for WINFO calculation result messages.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1939
diff changeset
892 errors.addProblem(kms[i], "cannot.find.q", q);
686
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
893 }
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
894 ws[i] = Double.NaN;
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
895 continue;
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
896 }
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
897
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
898 kmKey.km = kms[i];
645
433f67a076aa Use an explicit reference km for interpolation now.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 633
diff changeset
899 int rowIndex = Collections.binarySearch(rows, kmKey);
426
c6b7ca0febcb Fix step to fix issue69: Do the right calculation
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 395
diff changeset
900
c6b7ca0febcb Fix step to fix issue69: Do the right calculation
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 395
diff changeset
901 if (rowIndex >= 0) {
c6b7ca0febcb Fix step to fix issue69: Do the right calculation
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 395
diff changeset
902 // direct row match
686
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
903 if (Double.isNaN(ws[i] = rows.get(rowIndex).getW(qPosition))
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
904 && errors != null) {
2166
2898b1ff6013 I18N for WINFO calculation result messages.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1939
diff changeset
905 errors.addProblem(kms[i], "cannot.find.w.for.q", q);
686
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
906 }
426
c6b7ca0febcb Fix step to fix issue69: Do the right calculation
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 395
diff changeset
907 continue;
c6b7ca0febcb Fix step to fix issue69: Do the right calculation
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 395
diff changeset
908 }
c6b7ca0febcb Fix step to fix issue69: Do the right calculation
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 395
diff changeset
909
c6b7ca0febcb Fix step to fix issue69: Do the right calculation
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 395
diff changeset
910 rowIndex = -rowIndex -1;
c6b7ca0febcb Fix step to fix issue69: Do the right calculation
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 395
diff changeset
911
1681
e5f7f25a511c fixed flys/issue201
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1098
diff changeset
912 if (rowIndex < 1 || rowIndex > R1) {
426
c6b7ca0febcb Fix step to fix issue69: Do the right calculation
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 395
diff changeset
913 // do not extrapolate
686
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
914 if (errors != null) {
2166
2898b1ff6013 I18N for WINFO calculation result messages.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1939
diff changeset
915 errors.addProblem(kms[i], "km.not.found");
686
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
916 }
1888
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
917 ws[i] = Double.NaN;
426
c6b7ca0febcb Fix step to fix issue69: Do the right calculation
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 395
diff changeset
918 continue;
c6b7ca0febcb Fix step to fix issue69: Do the right calculation
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 395
diff changeset
919 }
c6b7ca0febcb Fix step to fix issue69: Do the right calculation
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 395
diff changeset
920 Row r1 = rows.get(rowIndex-1);
c6b7ca0febcb Fix step to fix issue69: Do the right calculation
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 395
diff changeset
921 Row r2 = rows.get(rowIndex);
633
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
922
686
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
923 if (Double.isNaN(ws[i] = r1.getW(r2, kms[i], qPosition))
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
924 && errors != null) {
2166
2898b1ff6013 I18N for WINFO calculation result messages.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1939
diff changeset
925 errors.addProblem(kms[i], "cannot.find.w.for.q", q);
686
3dc61e00385e Merged with trunk and introduced hashing of computed values.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 655
diff changeset
926 }
426
c6b7ca0febcb Fix step to fix issue69: Do the right calculation
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 395
diff changeset
927 }
c6b7ca0febcb Fix step to fix issue69: Do the right calculation
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 395
diff changeset
928
427
909196be11a0 First step to calculate "W fuer ungleichwertige Abfluesse" correctly. flys/issue55
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 426
diff changeset
929 return qPosition;
426
c6b7ca0febcb Fix step to fix issue69: Do the right calculation
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 395
diff changeset
930 }
633
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
931
1888
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
932 /**
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
933 * Linearly interpolate w at a km at a column of two rows.
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
934 *
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
935 * @param km position for which to interpolate.
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
936 * @param row1 first row.
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
937 * @param row2 second row.
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
938 * @param col column-index at which to look.
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
939 *
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
940 * @return Linearly interpolated w, NaN if one of the given rows was null.
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
941 */
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
942 public static double linearW(double km, Row row1, Row row2, int col) {
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
943 if (row1 == null || row2 == null) {
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
944 return Double.NaN;
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
945 }
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
946
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
947 return Linear.linear(km,
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
948 row1.km, row2.km,
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
949 row1.ws[col], row2.ws[col]);
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
950 }
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
951
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
952 /**
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
953 * Do interpolation/lookup of W and Q within columns (i.e. ignoring values
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
954 * of other columns).
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
955 * @param km position (km) at which to interpolate/lookup.
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
956 * @return [[q0, q1, .. qx] , [w0, w1, .. wx]] (can contain NaNs)
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
957 */
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
958 public double [][] interpolateWQColumnwise(double km) {
1919
9bec7d2f8c35 Prevent ArrayIndexOutOfBounds, log method entry.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1907
diff changeset
959 log.debug("WstValueTable.interpolateWQColumnwise");
1888
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
960 double [] qs = new double[columns.length];
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
961 double [] ws = new double[columns.length];
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
962
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
963 // Find out row from where we will start searching.
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
964 int rowIndex = Collections.binarySearch(rows, new Row(km));
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
965
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
966 if (rowIndex < 0) {
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
967 rowIndex = -rowIndex -1;
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
968 }
2248
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 2186
diff changeset
969
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 2186
diff changeset
970 // TODO Beyond definition, we could stop more clever.
1937
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
971 if (rowIndex >= rows.size()) {
1919
9bec7d2f8c35 Prevent ArrayIndexOutOfBounds, log method entry.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1907
diff changeset
972 rowIndex = rows.size() -1;
1937
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
973 }
1888
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
974
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
975 Row startRow = rows.get(rowIndex);
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
976
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
977 for (int col = 0; col < columns.length; col++) {
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
978 qs[col] = columns[col].getQRangeTree().findQ(km);
7015
a9ff696c2d18 Fixed misuse of x !=/== Double.NaN
Sascha L. Teichmann <teichmann@intevation.de>
parents: 7000
diff changeset
979 if (startRow.km == km && !Double.isNaN(startRow.ws[col])) {
1888
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
980 // Great. W is defined at km.
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
981 ws[col] = startRow.ws[col];
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
982 continue;
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
983 }
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
984
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
985 // Search neighbouring rows that define w at this col.
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
986 Row rowBefore = null;
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
987 Row rowAfter = null;
1899
d002198c64a2 Removed logging noise, find better suited rows for W interpolation.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1888
diff changeset
988 for (int before = rowIndex -1; before >= 0; before--) {
1888
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
989 if (!Double.isNaN(rows.get(before).ws[col])) {
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
990 rowBefore = rows.get(before);
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
991 break;
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
992 }
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
993 }
2248
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 2186
diff changeset
994 if (rowBefore != null) {
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 2186
diff changeset
995 for (int after = rowIndex, R = rows.size(); after < R; after++) {
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 2186
diff changeset
996 if (!Double.isNaN(rows.get(after).ws[col])) {
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 2186
diff changeset
997 rowAfter = rows.get(after);
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 2186
diff changeset
998 break;
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 2186
diff changeset
999 }
1888
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
1000 }
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
1001 }
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
1002
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
1003 ws[col] = linearW(km, rowBefore, rowAfter, col);
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
1004 }
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
1005
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
1006 return new double [][] {qs, ws};
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
1007 }
abf5da3b285c Added new (at fixed columns) interpolation mechanism.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1887
diff changeset
1008
1937
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
1009 public double [] findQsForW(double km, double w) {
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
1010
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
1011 int rowIndex = Collections.binarySearch(rows, new Row(km));
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
1012
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
1013 if (rowIndex >= 0) {
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
1014 return rows.get(rowIndex).findQsForW(w, this);
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
1015 }
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
1016
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
1017 rowIndex = -rowIndex - 1;
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
1018
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
1019 if (rowIndex < 1 || rowIndex >= rows.size()) {
1939
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1020 // Do not extrapolate.
1937
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
1021 return new double[0];
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
1022 }
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
1023
1939
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1024 // Needs bilinear interpolation.
1937
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
1025 Row r1 = rows.get(rowIndex-1);
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
1026 Row r2 = rows.get(rowIndex);
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
1027
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
1028 return r1.findQsForW(r2, w, km, this);
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
1029 }
f07d64d5cbe1 'W auf freier Strecke' calculation. Fetch corresponding Qs for given Ws from the WST model
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1919
diff changeset
1030
1939
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1031 protected SplineFunction createSpline(double km, Calculation errors) {
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1032
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1033 int rowIndex = Collections.binarySearch(rows, new Row(km));
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1034
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1035 if (rowIndex >= 0) {
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1036 SplineFunction sf = rows.get(rowIndex).createSpline(this, errors);
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1037 if (sf == null && errors != null) {
2166
2898b1ff6013 I18N for WINFO calculation result messages.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1939
diff changeset
1038 errors.addProblem(km, "cannot.create.wq.relation");
1939
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1039 }
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1040 return sf;
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1041 }
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1042
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1043 rowIndex = -rowIndex - 1;
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1044
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1045 if (rowIndex < 1 || rowIndex >= rows.size()) {
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1046 // Do not extrapolate.
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1047 if (errors != null) {
2166
2898b1ff6013 I18N for WINFO calculation result messages.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1939
diff changeset
1048 errors.addProblem(km, "km.not.found");
1939
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1049 }
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1050 return null;
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1051 }
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1052
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1053 // Needs bilinear interpolation.
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1054 Row r1 = rows.get(rowIndex-1);
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1055 Row r2 = rows.get(rowIndex);
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1056
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1057 SplineFunction sf = r1.createSpline(r2, km, this, errors);
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1058 if (sf == null && errors != null) {
2166
2898b1ff6013 I18N for WINFO calculation result messages.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1939
diff changeset
1059 errors.addProblem(km, "cannot.create.wq.relation");
1939
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1060 }
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1061
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1062 return sf;
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1063 }
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1064
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1065 /** 'Bezugslinienverfahren' */
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1066 public double [][] relateWs(
3076
5642a83420f2 FLYS artifacts: Removed trailing whitespace.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2560
diff changeset
1067 double km1,
1939
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1068 double km2,
2186
ec2574eb2d32 Added calculation class for "Bezugslinienverfahren" to created by WINFOArtifact.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2166
diff changeset
1069 Calculation errors
ec2574eb2d32 Added calculation class for "Bezugslinienverfahren" to created by WINFOArtifact.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2166
diff changeset
1070 ) {
ec2574eb2d32 Added calculation class for "Bezugslinienverfahren" to created by WINFOArtifact.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2166
diff changeset
1071 return relateWs(km1, km2, RELATE_WS_SAMPLES, errors);
ec2574eb2d32 Added calculation class for "Bezugslinienverfahren" to created by WINFOArtifact.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2166
diff changeset
1072 }
ec2574eb2d32 Added calculation class for "Bezugslinienverfahren" to created by WINFOArtifact.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2166
diff changeset
1073
2330
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1074 private static class ErrorHandler {
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1075
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1076 boolean hasErrors;
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1077 Calculation errors;
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1078
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1079 ErrorHandler(Calculation errors) {
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1080 this.errors = errors;
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1081 }
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1082
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1083 void error(double km, String key, Object ... args) {
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1084 if (errors != null && !hasErrors) {
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1085 hasErrors = true;
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1086 errors.addProblem(km, key, args);
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1087 }
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1088 }
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1089 } // class ErrorHandler
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1090
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1091
2186
ec2574eb2d32 Added calculation class for "Bezugslinienverfahren" to created by WINFOArtifact.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2166
diff changeset
1092 /* TODO: Add optimized methods of relateWs to relate one
3076
5642a83420f2 FLYS artifacts: Removed trailing whitespace.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2560
diff changeset
1093 * start km to many end kms. The index generation/spline stuff for
2186
ec2574eb2d32 Added calculation class for "Bezugslinienverfahren" to created by WINFOArtifact.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2166
diff changeset
1094 * the start km is always the same.
ec2574eb2d32 Added calculation class for "Bezugslinienverfahren" to created by WINFOArtifact.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2166
diff changeset
1095 */
ec2574eb2d32 Added calculation class for "Bezugslinienverfahren" to created by WINFOArtifact.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2166
diff changeset
1096 public double [][] relateWs(
3076
5642a83420f2 FLYS artifacts: Removed trailing whitespace.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2560
diff changeset
1097 double km1,
2186
ec2574eb2d32 Added calculation class for "Bezugslinienverfahren" to created by WINFOArtifact.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2166
diff changeset
1098 double km2,
1939
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1099 int numSamples,
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1100 Calculation errors
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1101 ) {
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1102 SplineFunction sf1 = createSpline(km1, errors);
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1103 if (sf1 == null) {
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1104 return new double[2][0];
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1105 }
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1106
2248
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 2186
diff changeset
1107 SplineFunction sf2 = createSpline(km2, errors);
1939
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1108 if (sf2 == null) {
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1109 return new double[2][0];
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1110 }
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1111
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1112 PolynomialSplineFunction iQ1 = sf1.createIndexQRelation();
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1113 if (iQ1 == null) {
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1114 if (errors != null) {
2166
2898b1ff6013 I18N for WINFO calculation result messages.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1939
diff changeset
1115 errors.addProblem(km1, "cannot.create.index.q.relation");
1939
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1116 }
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1117 return new double[2][0];
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1118 }
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1119
2404
750cdcccb39c 'Bezugslinienverfahren': Fix the index bug.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2403
diff changeset
1120 PolynomialSplineFunction iQ2 = sf2.createIndexQRelation();
1939
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1121 if (iQ2 == null) {
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1122 if (errors != null) {
2166
2898b1ff6013 I18N for WINFO calculation result messages.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1939
diff changeset
1123 errors.addProblem(km2, "cannot.create.index.q.relation");
1939
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1124 }
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1125 return new double[2][0];
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1126 }
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1127
2316
61b32380ffdb Be more conservative about arrays and indices in "Bezugslinienverfahren".
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2282
diff changeset
1128 int N = Math.min(sf1.splineQs.length, sf2.splineQs.length);
1939
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1129 double stepWidth = N/(double)numSamples;
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1130
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1131 PolynomialSplineFunction qW1 = sf1.spline;
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1132 PolynomialSplineFunction qW2 = sf2.spline;
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1133
2316
61b32380ffdb Be more conservative about arrays and indices in "Bezugslinienverfahren".
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2282
diff changeset
1134 TDoubleArrayList ws1 = new TDoubleArrayList(numSamples);
61b32380ffdb Be more conservative about arrays and indices in "Bezugslinienverfahren".
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2282
diff changeset
1135 TDoubleArrayList ws2 = new TDoubleArrayList(numSamples);
61b32380ffdb Be more conservative about arrays and indices in "Bezugslinienverfahren".
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2282
diff changeset
1136 TDoubleArrayList qs1 = new TDoubleArrayList(numSamples);
61b32380ffdb Be more conservative about arrays and indices in "Bezugslinienverfahren".
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2282
diff changeset
1137 TDoubleArrayList qs2 = new TDoubleArrayList(numSamples);
1939
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1138
2330
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1139 ErrorHandler err = new ErrorHandler(errors);
1939
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1140
2316
61b32380ffdb Be more conservative about arrays and indices in "Bezugslinienverfahren".
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2282
diff changeset
1141 int i = 0;
61b32380ffdb Be more conservative about arrays and indices in "Bezugslinienverfahren".
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2282
diff changeset
1142 for (double p = 0d; p <= N-1; p += stepWidth, ++i) {
2330
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1143
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1144 double q1;
1939
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1145 try {
2330
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1146 q1 = iQ1.value(p);
1939
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1147 }
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1148 catch (ArgumentOutsideDomainException aode) {
2330
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1149 err.error(km1, "w.w.qkm1.failed", p);
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1150 continue;
1939
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1151 }
2330
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1152
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1153 double w1;
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1154 try {
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1155 w1 = qW1.value(q1);
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1156 }
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1157 catch (ArgumentOutsideDomainException aode) {
2403
177b0c91928d 'Bezugslinienverfahren': Improve the error messages even more.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2330
diff changeset
1158 err.error(km1, "w.w.wkm1.failed", q1, p);
2330
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1159 continue;
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1160 }
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1161
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1162 double q2;
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1163 try {
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1164 q2 = iQ2.value(p);
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1165 }
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1166 catch (ArgumentOutsideDomainException aode) {
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1167 err.error(km2, "w.w.qkm2.failed", p);
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1168 continue;
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1169 }
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1170
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1171 double w2;
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1172 try {
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1173 w2 = qW2.value(q2);
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1174 }
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1175 catch (ArgumentOutsideDomainException aode) {
2403
177b0c91928d 'Bezugslinienverfahren': Improve the error messages even more.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2330
diff changeset
1176 err.error(km2, "w.w.wkm2.failed", q2, p);
2330
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1177 continue;
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1178 }
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1179
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1180 ws1.add(w1);
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1181 ws2.add(w2);
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1182 qs1.add(q1);
594885703687 Picked changes r4015:4026 from trunk.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 2316
diff changeset
1183 qs2.add(q2);
1939
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1184 }
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1185
2316
61b32380ffdb Be more conservative about arrays and indices in "Bezugslinienverfahren".
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2282
diff changeset
1186 return new double [][] {
61b32380ffdb Be more conservative about arrays and indices in "Bezugslinienverfahren".
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2282
diff changeset
1187 ws1.toNativeArray(),
3076
5642a83420f2 FLYS artifacts: Removed trailing whitespace.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2560
diff changeset
1188 qs1.toNativeArray(),
2316
61b32380ffdb Be more conservative about arrays and indices in "Bezugslinienverfahren".
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2282
diff changeset
1189 ws2.toNativeArray(),
61b32380ffdb Be more conservative about arrays and indices in "Bezugslinienverfahren".
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 2282
diff changeset
1190 qs2.toNativeArray() };
1939
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1191 }
2730d17df021 Added the implementation of the 'Bezugslinienverfahren'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1938
diff changeset
1192
633
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
1193 public QPosition getQPosition(double km, double q) {
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
1194 return getQPosition(km, q, new QPosition());
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
1195 }
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
1196
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
1197 public QPosition getQPosition(double km, double q, QPosition qPosition) {
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
1198
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
1199 if (columns.length == 0) {
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
1200 return null;
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
1201 }
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
1202
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
1203 double qLast = columns[0].getQRangeTree().findQ(km);
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
1204
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
1205 if (Math.abs(qLast - q) < 0.00001) {
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
1206 return qPosition.set(0, 1d);
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
1207 }
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
1208
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
1209 for (int i = 1; i < columns.length; ++i) {
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
1210 double qCurrent = columns[i].getQRangeTree().findQ(km);
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
1211 if (Math.abs(qCurrent - q) < 0.00001) {
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
1212 return qPosition.set(i, 1d);
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
1213 }
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
1214
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
1215 double qMin, qMax;
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
1216 if (qLast < qCurrent) { qMin = qLast; qMax = qCurrent; }
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
1217 else { qMin = qCurrent; qMax = qLast; }
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
1218
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
1219 if (q > qMin && q < qMax) {
655
913b52064449 Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 649
diff changeset
1220 double weight = Linear.factor(q, qLast, qCurrent);
633
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
1221 return qPosition.set(i, weight);
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
1222 }
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
1223 qLast = qCurrent;
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
1224 }
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
1225
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
1226 return null;
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
1227 }
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
1228
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
1229 public double getQIndex(int index, double km) {
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
1230 return columns[index].getQRangeTree().findQ(km);
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
1231 }
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
1232
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
1233 public double getQ(QPosition qPosition, double km) {
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
1234 int index = qPosition.index;
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
1235 double weight = qPosition.weight;
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
1236
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
1237 if (weight == 1d) {
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
1238 return columns[index].getQRangeTree().findQ(km);
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
1239 }
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
1240 double q1 = columns[index-1].getQRangeTree().findQ(km);
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
1241 double q2 = columns[index ].getQRangeTree().findQ(km);
655
913b52064449 Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 649
diff changeset
1242 return Linear.weight(weight, q1, q2);
633
d08f77e7f7e8 WST value table: Qs are now stored in ranges for each column.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 632
diff changeset
1243 }
3736
da1969b05292 WST tables: Added interpolation of tabulated values only.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3271
diff changeset
1244
da1969b05292 WST tables: Added interpolation of tabulated values only.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3271
diff changeset
1245 public double [][] interpolateTabulated(double km) {
da1969b05292 WST tables: Added interpolation of tabulated values only.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3271
diff changeset
1246 return interpolateTabulated(km, new double[2][columns.length]);
da1969b05292 WST tables: Added interpolation of tabulated values only.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3271
diff changeset
1247 }
da1969b05292 WST tables: Added interpolation of tabulated values only.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3271
diff changeset
1248
da1969b05292 WST tables: Added interpolation of tabulated values only.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3271
diff changeset
1249 public double [][] interpolateTabulated(double km, double [][] result) {
da1969b05292 WST tables: Added interpolation of tabulated values only.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3271
diff changeset
1250
da1969b05292 WST tables: Added interpolation of tabulated values only.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3271
diff changeset
1251 int rowIndex = Collections.binarySearch(rows, new Row(km));
da1969b05292 WST tables: Added interpolation of tabulated values only.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3271
diff changeset
1252
da1969b05292 WST tables: Added interpolation of tabulated values only.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3271
diff changeset
1253 if (rowIndex >= 0) {
da1969b05292 WST tables: Added interpolation of tabulated values only.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3271
diff changeset
1254 // Direct hit -> copy ws.
da1969b05292 WST tables: Added interpolation of tabulated values only.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3271
diff changeset
1255 Row row = rows.get(rowIndex);
da1969b05292 WST tables: Added interpolation of tabulated values only.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3271
diff changeset
1256 System.arraycopy(
da1969b05292 WST tables: Added interpolation of tabulated values only.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3271
diff changeset
1257 row.ws, 0, result[0], 0,
da1969b05292 WST tables: Added interpolation of tabulated values only.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3271
diff changeset
1258 Math.min(row.ws.length, result[0].length));
da1969b05292 WST tables: Added interpolation of tabulated values only.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3271
diff changeset
1259 }
da1969b05292 WST tables: Added interpolation of tabulated values only.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3271
diff changeset
1260 else {
da1969b05292 WST tables: Added interpolation of tabulated values only.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3271
diff changeset
1261 rowIndex = -rowIndex -1;
da1969b05292 WST tables: Added interpolation of tabulated values only.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3271
diff changeset
1262 if (rowIndex < 1 || rowIndex >= rows.size()) {
da1969b05292 WST tables: Added interpolation of tabulated values only.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3271
diff changeset
1263 // Out of bounds.
da1969b05292 WST tables: Added interpolation of tabulated values only.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3271
diff changeset
1264 return null;
da1969b05292 WST tables: Added interpolation of tabulated values only.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3271
diff changeset
1265 }
da1969b05292 WST tables: Added interpolation of tabulated values only.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3271
diff changeset
1266 // Interpolate ws.
da1969b05292 WST tables: Added interpolation of tabulated values only.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3271
diff changeset
1267 Row r1 = rows.get(rowIndex-1);
da1969b05292 WST tables: Added interpolation of tabulated values only.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3271
diff changeset
1268 Row r2 = rows.get(rowIndex);
da1969b05292 WST tables: Added interpolation of tabulated values only.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3271
diff changeset
1269 double factor = Linear.factor(km, r1.km, r2.km);
da1969b05292 WST tables: Added interpolation of tabulated values only.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3271
diff changeset
1270 Linear.weight(factor, r1.ws, r2.ws, result[0]);
da1969b05292 WST tables: Added interpolation of tabulated values only.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3271
diff changeset
1271 }
da1969b05292 WST tables: Added interpolation of tabulated values only.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3271
diff changeset
1272
da1969b05292 WST tables: Added interpolation of tabulated values only.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3271
diff changeset
1273 double [] qs = result[1];
da1969b05292 WST tables: Added interpolation of tabulated values only.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3271
diff changeset
1274 for (int i = Math.min(qs.length, columns.length)-1; i >= 0; --i) {
da1969b05292 WST tables: Added interpolation of tabulated values only.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3271
diff changeset
1275 qs[i] = columns[i].getQRangeTree().findQ(km);
da1969b05292 WST tables: Added interpolation of tabulated values only.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3271
diff changeset
1276 }
da1969b05292 WST tables: Added interpolation of tabulated values only.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3271
diff changeset
1277 return result;
da1969b05292 WST tables: Added interpolation of tabulated values only.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3271
diff changeset
1278 }
3743
51f76225823b Extreme waterlevels: calculate the segments for Q km ranges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3736
diff changeset
1279
4119
760e2fe00138 Documentation.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 3969
diff changeset
1280
6923
254a3f3556ee WstValueTable: Add method to find out wether the Qs are 'fake'
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6711
diff changeset
1281 /** True if no QRange is given or Q equals zero. */
254a3f3556ee WstValueTable: Add method to find out wether the Qs are 'fake'
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6711
diff changeset
1282 public boolean hasEmptyQ() {
254a3f3556ee WstValueTable: Add method to find out wether the Qs are 'fake'
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6711
diff changeset
1283 for (Column column: columns) {
254a3f3556ee WstValueTable: Add method to find out wether the Qs are 'fake'
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6711
diff changeset
1284 if (column.getQRangeTree() == null) {
254a3f3556ee WstValueTable: Add method to find out wether the Qs are 'fake'
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6711
diff changeset
1285 return true;
254a3f3556ee WstValueTable: Add method to find out wether the Qs are 'fake'
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6711
diff changeset
1286 }
254a3f3556ee WstValueTable: Add method to find out wether the Qs are 'fake'
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6711
diff changeset
1287 else {
254a3f3556ee WstValueTable: Add method to find out wether the Qs are 'fake'
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6711
diff changeset
1288 if (Math.abs(column.getQRangeTree().maxQ()) <= 0.01d) {
254a3f3556ee WstValueTable: Add method to find out wether the Qs are 'fake'
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6711
diff changeset
1289 return true;
254a3f3556ee WstValueTable: Add method to find out wether the Qs are 'fake'
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6711
diff changeset
1290 }
254a3f3556ee WstValueTable: Add method to find out wether the Qs are 'fake'
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6711
diff changeset
1291 }
254a3f3556ee WstValueTable: Add method to find out wether the Qs are 'fake'
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6711
diff changeset
1292 }
254a3f3556ee WstValueTable: Add method to find out wether the Qs are 'fake'
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6711
diff changeset
1293
254a3f3556ee WstValueTable: Add method to find out wether the Qs are 'fake'
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6711
diff changeset
1294 if (columns.length == 0) {
254a3f3556ee WstValueTable: Add method to find out wether the Qs are 'fake'
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6711
diff changeset
1295 log.warn("No columns in WstValueTable.");
254a3f3556ee WstValueTable: Add method to find out wether the Qs are 'fake'
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6711
diff changeset
1296 }
254a3f3556ee WstValueTable: Add method to find out wether the Qs are 'fake'
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6711
diff changeset
1297
254a3f3556ee WstValueTable: Add method to find out wether the Qs are 'fake'
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6711
diff changeset
1298 return false;
254a3f3556ee WstValueTable: Add method to find out wether the Qs are 'fake'
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6711
diff changeset
1299 }
254a3f3556ee WstValueTable: Add method to find out wether the Qs are 'fake'
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6711
diff changeset
1300
254a3f3556ee WstValueTable: Add method to find out wether the Qs are 'fake'
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6711
diff changeset
1301
4119
760e2fe00138 Documentation.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 3969
diff changeset
1302 /** Find ranges that are between km1 and km2 (inclusive?) */
3743
51f76225823b Extreme waterlevels: calculate the segments for Q km ranges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3736
diff changeset
1303 public List<Range> findSegments(double km1, double km2) {
51f76225823b Extreme waterlevels: calculate the segments for Q km ranges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3736
diff changeset
1304 return columns.length != 0
51f76225823b Extreme waterlevels: calculate the segments for Q km ranges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3736
diff changeset
1305 ? columns[columns.length-1].getQRangeTree().findSegments(km1, km2)
51f76225823b Extreme waterlevels: calculate the segments for Q km ranges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3736
diff changeset
1306 : Collections.<Range>emptyList();
51f76225823b Extreme waterlevels: calculate the segments for Q km ranges.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 3736
diff changeset
1307 }
326
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1308 }
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1309 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org