Mercurial > dive4elements > river
annotate artifacts/src/main/java/org/dive4elements/river/artifacts/model/InfoldingColumns.java @ 8442:e65aad00b3a1
Do not transform Q values from cm to m.
author | "Tom Gottfried <tom@intevation.de>" |
---|---|
date | Tue, 21 Oct 2014 12:14:39 +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 : |