annotate artifacts/src/main/java/org/dive4elements/river/artifacts/model/InfoldingColumns.java @ 6152:0587819960c3

Waterlevel differences & bed height differences: Add new model LinearInterpolated intented to unify the two very similiar calculations. The focus of the current implementation is correctness and not speed! The fact that the data sets more mostly sorted by station is not exploited. Doing so would improve performance significantly.
author Sascha L. Teichmann <teichmann@intevation.de>
date Sun, 02 Jun 2013 17:52:53 +0200
parents af13ceeba52a
children
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: 4819
diff changeset
9 package org.dive4elements.river.artifacts.model;
4800
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
10
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
11 /** A pretty naive pointwise algorithm to find out the columns
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
12 * of a WSTValueTable which imfold ("umhuellen") a set of WQKMs
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
13 * in terms of Q.
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
14 * A better implemention would exploit the fact that the
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
15 * Qs normally are constant for a while along km. This would
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
16 * reduce the runtime complexity to only a few Q spans instead
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
17 * of the pointwise evaluation.
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
18 */
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
19 public class InfoldingColumns
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
20 {
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
21 private QRangeTree.QuickQFinder [] qFinders;
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
22
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
23 private boolean [] infoldingColumns;
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
24
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
25 public InfoldingColumns() {
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
26 }
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
27
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
28 public InfoldingColumns(WstValueTable.Column [] columns) {
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
29
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
30 qFinders = new QRangeTree.QuickQFinder[columns.length];
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
31 for (int i = 0; i < qFinders.length; ++i) {
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
32 qFinders[i] = columns[i].getQRangeTree().new QuickQFinder();
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
33 }
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
34
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
35 infoldingColumns = new boolean[columns.length];
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
36 }
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
37
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
38 public boolean [] getInfoldingColumns() {
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
39 return infoldingColumns;
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
40 }
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
41
4819
243f1eb02b95 Use QKMs in calculation of the 'Umhuellende'.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4800
diff changeset
42 public void markInfoldingColumns(QKms [] qkms) {
243f1eb02b95 Use QKMs in calculation of the 'Umhuellende'.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4800
diff changeset
43 for (QKms qk: qkms) {
243f1eb02b95 Use QKMs in calculation of the 'Umhuellende'.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4800
diff changeset
44 markInfoldingColumns(qk);
4800
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
45 }
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
46 }
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
47
4819
243f1eb02b95 Use QKMs in calculation of the 'Umhuellende'.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4800
diff changeset
48 public void markInfoldingColumns(QKms qkms) {
243f1eb02b95 Use QKMs in calculation of the 'Umhuellende'.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4800
diff changeset
49 int N = qkms.size();
4800
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
50 int C = qFinders.length-1;
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
51 for (int i = 0; i < N; ++i) {
4819
243f1eb02b95 Use QKMs in calculation of the 'Umhuellende'.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4800
diff changeset
52 double km = qkms.getKm(i);
243f1eb02b95 Use QKMs in calculation of the 'Umhuellende'.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4800
diff changeset
53 double q = qkms.getQ(i);
4800
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
54 double above = Double.MAX_VALUE;
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
55 double below = -Double.MAX_VALUE;
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
56 int aboveIdx = -1;
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
57 int belowIdx = -1;
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
58
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
59 for (int j = C; j >= 0; --j) {
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
60 double qc = qFinders[j].findQ(km);
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
61 if (Double.isNaN(qc)) {
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
62 continue;
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
63 }
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
64 if (qc <= q) {
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
65 if (qc > below) {
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
66 below = qc;
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
67 belowIdx = j;
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
68 }
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
69 }
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
70 else if (qc < above) { // qc > q
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
71 above = qc;
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
72 aboveIdx = j;
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
73 }
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
74 }
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
75
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
76 if (aboveIdx != -1) {
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
77 infoldingColumns[aboveIdx] = true;
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
78 }
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
79
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
80 if (belowIdx != -1) {
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
81 infoldingColumns[belowIdx] = true;
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
82 }
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
83 }
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
84 }
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
85 }
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
86 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org