Mercurial > dive4elements > river
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 : |