annotate flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java @ 395:aae8f327425e

'berechnete Abflusskurve': generate ws from qs flys-artifacts/trunk@1822 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Wed, 04 May 2011 13:51:25 +0000
parents 5f55047a17e8
children c6b7ca0febcb
rev   line source
326
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1 package de.intevation.flys.artifacts.model;
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
2
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
3 import java.io.Serializable;
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
4
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
5 import de.intevation.flys.model.River;
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
6 import de.intevation.flys.model.Wst;
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
7 import de.intevation.flys.model.WstColumn;
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
8
374
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
9 import de.intevation.flys.artifacts.cache.CacheFactory;
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
10
326
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
11 import de.intevation.flys.backend.SessionHolder;
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
12
335
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
13 import java.util.Arrays;
326
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
14 import java.util.ArrayList;
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
15 import java.util.Comparator;
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
16 import java.util.List;
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
17 import java.util.Collections;
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
18
339
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
19 import org.apache.log4j.Logger;
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
20
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
21 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
22
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
23 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
24
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
25 import org.apache.commons.math.ArgumentOutsideDomainException;
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
26
326
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
27 import org.hibernate.Session;
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
28 import org.hibernate.Query;
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
29 import org.hibernate.SQLQuery;
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
30
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
31 import org.hibernate.type.StandardBasicTypes;
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
32
374
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
33 import net.sf.ehcache.Cache;
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
34 import net.sf.ehcache.Element;
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
35
326
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
36 public class WstValueTable
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
37 implements Serializable
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
38 {
339
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
39 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
40
374
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
41 public static final String CACHE_NAME = "wst-value-table";
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
42
326
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
43 // TODO: put this into a property file
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
44 public static final String SQL_POS_WQ =
327
e09634fbf6bc Moved the query complexity of creating a w/q value table into view
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 326
diff changeset
45 "SELECT position, w, q, column_pos" +
e09634fbf6bc Moved the query complexity of creating a w/q value table into view
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 326
diff changeset
46 " FROM wst_value_table" +
e09634fbf6bc Moved the query complexity of creating a w/q value table into view
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 326
diff changeset
47 " WHERE wst_id = :wst_id";
326
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
48
395
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
49 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
50
326
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
51 public static class Column
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
52 implements Serializable
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
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
56 public Column() {
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
57 }
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
58
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
59 public Column(String name) {
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
60 this.name = name;
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
61 }
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
62
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
63 public String getName() {
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
64 return name;
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
65 }
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
66
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
67 public void setName(String name) {
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
68 this.name = name;
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
69 }
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
70 }
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
71 // class Column
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
72
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
73 public static class Row
335
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
74 implements Serializable, Comparable<Row>
326
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
75 {
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
76 double km;
335
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
77 double [] ws;
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
78 double [] qs;
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
79 boolean qSorted;
326
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
80
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
81 public Row() {
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
82 }
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
83
335
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
84 public Row(double km) {
326
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
85 this.km = km;
335
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
86 }
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
87
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
88 public Row(double km, double [] ws, double [] qs) {
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
89 this(km);
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
90 this.ws = ws;
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
91 this.qs = qs;
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
92 }
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
93
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
94 public static final double linear(
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
95 double x,
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
96 double x1, double x2,
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
97 double y1, double y2
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
98 ) {
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
99 // y1 = m*x1 + b
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
100 // y2 = m*x2 + b
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
101 // y2 - y1 = m*(x2 - x1)
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
102 // m = (y2 - y1)/(x2 - x1) # x2 != x1
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
103 // b = y1 - m*x1
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
104
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
105 if (x1 == x2) {
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
106 return 0.5*(y1 + y2);
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
107 }
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
108 double m = (y2 - y1)/(x2 - x1);
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
109 double b = y1 - m*x1;
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
110 return x*m + b;
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
111 }
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
112
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
113 public static final double factor(double x, double p1, double p2) {
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
114 // 0 = m*p1 + b <=> b = -m*p1
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
115 // 1 = m*p2 + b
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
116 // 1 = m*(p2 - p1)
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
117 // m = 1/(p2 - p1) # p1 != p2
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
118 // f(x) = x/(p2-p1) - p1/(p2-p1) <=> (x-p1)/(p2-p1)
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
119
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
120 return p1 == p2 ? 0.0 : (x-p1)/(p2-p1);
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
121 }
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
122
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
123 public static final double weight(double factor, double a, double b) {
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
124 return (1.0-factor)*a + factor*b;
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
125 }
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
126
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
127 public double getWForKM(Row other, int index, double km) {
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
128 double w1 = ws[index];
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
129 double w2 = other.ws[index];
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
130 double km1 = this.km;
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
131 double km2 = other.km;
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
132 return linear(km, km1, km2, w1, w2);
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
133 }
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
134
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
135 public void interpolateW(
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
136 Row other,
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
137 double km,
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
138 double [] input,
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
139 double [] output
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
140 ) {
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
141 double factor = factor(km, this.km, other.km);
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
142
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
143 for (int i = 0; i < input.length; ++i) {
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
144 double q = input[i];
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
145 int idx1 = getQIndex(q);
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
146 int idx2 = other.getQIndex(q);
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
147
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
148 double w1 = idx1 >= 0
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
149 ? ws[idx1]
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
150 : interpolateW(-idx1-1, q);
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
151
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
152 double w2 = idx2 >= 0
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
153 ? other.ws[idx2]
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
154 : other.interpolateW(-idx2-1, q);
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
155
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
156 output[i] = weight(factor, w1, w2);
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
157 }
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
158 }
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
159
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
160 public double interpolateW(int idx, double q) {
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
161 return idx < 1 || idx >= qs.length
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
162 ? Double.NaN // do not extrapolate
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
163 : linear(q, qs[idx-1], qs[idx], ws[idx-1], ws[idx]);
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
164 }
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
165
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
166 public double interpolateW(double q) {
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
167 if (Double.isNaN(q)) return Double.NaN;
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
168 int index = getQIndex(q);
360
3571357c85a7 Bugfix: Removed endless loop and a bug while iterating over Hibernate results.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 344
diff changeset
169 return index >= 0 ? ws[index] : interpolateW(-index -1, q);
335
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
170 }
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
171
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
172 public int getQIndex(double q) {
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
173 return qSorted ? binaryQIndex(q) : linearQIndex(q);
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
174 }
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
175
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
176 public int binaryQIndex(double q) {
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
177 return Arrays.binarySearch(qs, q);
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
178 }
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
179
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
180 public int linearQIndex(double q) {
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
181 switch (qs.length) {
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
182 case 0: break;
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
183 case 1:
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
184 if (qs[0] == q) return 0;
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
185 if (qs[0] < q) return -(1+1);
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
186 return -(0+1);
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
187 default:
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
188 for (int i = 1; i < qs.length; ++i) {
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
189 double qa = qs[i-1];
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
190 double qb = qs[i];
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
191 if (qa == q) return i-1;
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
192 if (qb == q) return i;
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
193 if (qa > qb) { double t = qa; qa = qb; qb = t; }
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
194 if (q > qa && q < qb) return -(i+1);
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 return -qs.length;
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
197 }
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
198
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
199 return -1;
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
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
202 public int compareTo(Row other) {
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
203 double d = km - other.km;
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
204 if (d < 0.0) return -1;
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
205 if (d > 0.0) return +1;
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
206 return 0;
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
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
209 public double [][] cloneWQs() {
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
210 return new double [][] {
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
211 (double [])ws.clone(),
344
79401797f4e1 Corrected a silly c&p mistake.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 339
diff changeset
212 (double [])qs.clone() };
339
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
213 }
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
214
395
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
215 public double [][] interpolateWQ(Row other, double km, int steps) {
339
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
216
395
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
217 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
218
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
219 if (W < 1) {
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
220 return new double[2][0];
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
221 }
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
222
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
223 double factor = factor(km, this.km, other.km);
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
224
395
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
225 double [] splineQ = new double[W];
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
226 double [] splineW = new double[W];
339
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
227
395
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
228 double minQ = Double.MAX_VALUE;
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
229 double maxQ = -Double.MAX_VALUE;
339
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
230
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
231 for (int i = 0; i < W; ++i) {
395
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
232 double wws = weight(factor, ws[i], other.ws[i]);
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
233 double wqs = weight(factor, qs[i], other.qs[i]);
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
234 splineW[i] = wws;
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
235 splineQ[i] = wqs;
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
236 if (wqs < minQ) minQ = wqs;
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
237 if (wqs > maxQ) maxQ = wqs;
339
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
238 }
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
239
395
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
240 double stepWidth = (maxQ - minQ)/steps;
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
241
339
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
242 SplineInterpolator interpolator = new SplineInterpolator();
395
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
243 PolynomialSplineFunction spline =
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
244 interpolator.interpolate(splineQ, splineW);
339
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
245
395
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
246 double [] outWs = new double[steps];
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
247 double [] outQs = new double[steps];
339
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
248
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
249 try {
395
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
250 double q = minQ;
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
251 for (int i = 0; i < outWs.length; ++i, q += stepWidth) {
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
252 outWs[i] = spline.value(outQs[i] = q);
339
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
253 }
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
254 }
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
255 catch (ArgumentOutsideDomainException aode) {
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
256 log.error("Spline interpolation failed.", aode);
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
257 }
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
258
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
259 return new double [][] { outWs, outQs };
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
260 }
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
261
395
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
262 public double [][] interpolateWQ(int steps) {
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
263
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
264 int W = ws.length;
339
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
265
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
266 if (W < 1) {
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
267 return new double[2][0];
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
268 }
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
269
395
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
270 double [] splineW = new double[W];
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
271 double [] splineQ = new double[W];
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
272
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
273 double minQ = Double.MAX_VALUE;
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
274 double maxQ = -Double.MAX_VALUE;
339
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
275
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
276 for (int i = 0; i < W; ++i) {
395
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
277 splineW[i] = ws[i];
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
278 splineQ[i] = qs[i];
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
279 if (qs[i] < minQ) minQ = qs[i];
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
280 if (qs[i] > maxQ) maxQ = qs[i];
339
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
281 }
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
282
395
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
283 double stepWidth = (maxQ - minQ)/steps;
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
284
339
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
285 SplineInterpolator interpolator = new SplineInterpolator();
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
286
395
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
287 PolynomialSplineFunction spline =
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
288 interpolator.interpolate(splineQ, splineW);
339
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
289
395
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
290 double [] outWs = new double[steps];
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
291 double [] outQs = new double[steps];
339
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
292
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
293 try {
395
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
294 double q = minQ;
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
295 for (int i = 0; i < outWs.length; ++i, q += stepWidth) {
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
296 outWs[i] = spline.value(outQs[i] = q);
339
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
297 }
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
298 }
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
299 catch (ArgumentOutsideDomainException aode) {
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
300 log.error("Spline interpolation failed.", aode);
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
301 }
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
302
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
303 return new double [][] { outWs, outQs };
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
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
306 public int ascendingWs() {
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
307 if (ws.length < 2) {
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
308 return ws.length;
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
309 }
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 int idx = 1;
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
312
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
313 for (; idx < ws.length; ++idx) {
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
314 if (Double.isNaN(ws[idx]) || ws[idx] < ws[idx-1]) {
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
315 return idx;
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 }
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
318
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
319 return idx;
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
320 }
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
321
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
322 public double [][] weightWQs(Row other, double km) {
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
323 int W = Math.min(ws.length, other.ws.length);
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
324 double factor = factor(km, this.km, other.km);
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
325
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
326 double [] outWs = new double[W];
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
327 double [] outQs = new double[W];
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
328
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
329 for (int i = 0; i < W; ++i) {
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
330 outWs[i] = weight(factor, ws[i], other.ws[i]);
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
331 outQs[i] = weight(factor, qs[i], other.qs[i]);
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
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
334 return new double [][] { outWs, outQs };
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
335 }
326
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
336 }
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
337 // class Row
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
338
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
339 protected List<Row> rows;
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
340
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
341 protected Column [] columns;
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
342
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
343 public WstValueTable() {
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
344 rows = new ArrayList<Row>();
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
345 }
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
346
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
347 public WstValueTable(Column [] columns) {
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
348 this();
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
349 this.columns = columns;
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
350 }
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
351
335
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
352 public double [] interpolateW(double km, double [] qs) {
380
5f55047a17e8 Moved expensive allocation of result arrays out of km loop.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 374
diff changeset
353 return interpolateW(km, qs, new double[qs.length]);
5f55047a17e8 Moved expensive allocation of result arrays out of km loop.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 374
diff changeset
354 }
335
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
355
380
5f55047a17e8 Moved expensive allocation of result arrays out of km loop.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 374
diff changeset
356 public double [] interpolateW(double km, double [] qs, double [] ws) {
335
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
357
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
358 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
359
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
360 if (rowIndex >= 0) { // direct row match
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
361 Row row = rows.get(rowIndex);
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
362 for (int i = 0; i < qs.length; ++i) {
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
363 ws[i] = row.interpolateW(qs[i]);
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
364 }
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
365 }
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
366 else { // needs bilinear interpolation
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
367 rowIndex = -rowIndex -1;
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
368
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
369 if (rowIndex < 1 || rowIndex >= rows.size()) {
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
370 // do not extrapolate
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
371 Arrays.fill(ws, Double.NaN);
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
372 }
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
373 else {
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
374 rows.get(rowIndex-1).interpolateW(
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
375 rows.get(rowIndex),
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
376 km, qs, ws);
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
377 }
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
378 }
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
379
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
380 return ws;
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
381 }
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
382
339
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
383
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
384 public double [][] interpolateWQ(double km) {
395
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
385 return interpolateWQ(km, DEFAULT_Q_STEPS);
339
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
386 }
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
387
395
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
388 public double [][] interpolateWQ(double km, int steps) {
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
389
339
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
390 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
391
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
392 if (rowIndex >= 0) { // direct row match
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
393 Row row = rows.get(rowIndex);
395
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
394 return row.interpolateWQ(steps);
339
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
395 }
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
396
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
397 rowIndex = -rowIndex -1;
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
398
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
399 if (rowIndex < 1 || rowIndex >= rows.size()) {
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
400 // do not extrapolate
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
401 return new double[2][0];
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
402 }
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
403
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
404 Row r1 = rows.get(rowIndex-1);
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
405 Row r2 = rows.get(rowIndex);
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
406
395
aae8f327425e 'berechnete Abflusskurve': generate ws from qs
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 380
diff changeset
407 return r1.interpolateWQ(r2, km, steps);
339
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
408 }
4509ba8fae68 Implementation of "Abflusskurve/Abflusstafel" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 335
diff changeset
409
326
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
410 public static WstValueTable getTable(River river) {
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
411 return getTable(river, 0);
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
412 }
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
413
374
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
414 public static final class CacheKey
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
415 implements Serializable
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
416 {
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
417 private int riverId;
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
418 private int kind;
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
419
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
420 public CacheKey(int riverId, int kind) {
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
421 this.riverId = riverId;
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
422 this.kind = kind;
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
423 }
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
424
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
425 public int hashCode() {
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
426 return (riverId << 8) | kind;
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
427 }
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
428
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
429 public boolean equals(Object other) {
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
430 if (!(other instanceof CacheKey)) {
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
431 return false;
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
432 }
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
433 CacheKey o = (CacheKey)other;
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
434 return riverId == o.riverId && kind == o.kind;
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
435 }
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
436 } // class CacheKey
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
437
326
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
438 public static WstValueTable getTable(River river, int kind) {
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
439
374
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
440 Cache cache = CacheFactory.getCache(CACHE_NAME);
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
441
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
442 CacheKey cacheKey;
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
443
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
444 if (cache != null) {
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
445 cacheKey = new CacheKey(river.getId(), kind);
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
446 Element element = cache.get(cacheKey);
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
447 if (element != null) {
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
448 log.debug("got wst value table from cache");
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
449 return (WstValueTable)element.getValue();
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
450 }
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
451 }
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
452 else {
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
453 cacheKey = null;
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
454 }
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
455
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
456 WstValueTable valueTable = getTableUncached(river, kind);
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
457
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
458 if (cacheKey != null) {
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
459 log.debug("store wst value in cache");
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
460 Element element = new Element(cacheKey, valueTable);
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
461 cache.put(element);
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
462 }
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
463
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
464 return valueTable;
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
465 }
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
466
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
467 public static WstValueTable getTableUncached(River river, int kind) {
91fbaa2744bf Added caching support for the wst value tables.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
468
326
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
469 Session session = SessionHolder.HOLDER.get();
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
470
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
471 Query query = session.createQuery(
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
472 "from Wst where river=:river and kind=:kind");
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
473 query.setParameter("river", river);
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
474 query.setInteger("kind", kind);
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
475
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
476 List<Wst> wsts = query.list();
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
477
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
478 if (wsts.isEmpty()) {
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
479 return null;
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
480 }
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
481
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
482 Wst wst = wsts.get(0);
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
483
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
484 // TODO: Do this sorting at database level
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
485 List<WstColumn> wstColumns = new ArrayList(wst.getColumns());
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
486 Collections.sort(wstColumns, new Comparator<WstColumn>() {
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
487 public int compare(WstColumn a, WstColumn b) {
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
488 int pa = a.getPosition();
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
489 int pb = b.getPosition();
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
490 if (pa < pb) return -1;
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
491 if (pa > pb) return +1;
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
492 return 0;
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
493 }
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
494 });
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
495
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
496 Column [] columns = new Column[wstColumns.size()];
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
497 for (int i = 0; i < columns.length; ++i) {
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
498 columns[i] = new Column(wstColumns.get(i).getName());
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
499 }
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
500
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
501 // using native SQL here to avoid myriad of small objects.
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
502 SQLQuery sqlQuery = session.createSQLQuery(SQL_POS_WQ)
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
503 .addScalar("position", StandardBasicTypes.DOUBLE)
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
504 .addScalar("w", StandardBasicTypes.DOUBLE)
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
505 .addScalar("q", StandardBasicTypes.DOUBLE)
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
506 .addScalar("column_pos", StandardBasicTypes.INTEGER);
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
507
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
508 sqlQuery.setInteger("wst_id", wst.getId());
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
509
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
510 WstValueTable valueTable = new WstValueTable(columns);
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
511
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
512 int lastColumnNo = -1;
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
513 Row row = null;
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
514
335
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
515 Double lastQ = -Double.MAX_VALUE;
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
516 boolean qSorted = true;
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
517
360
3571357c85a7 Bugfix: Removed endless loop and a bug while iterating over Hibernate results.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 344
diff changeset
518 for (Object r: sqlQuery.list()) {
3571357c85a7 Bugfix: Removed endless loop and a bug while iterating over Hibernate results.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 344
diff changeset
519 Object[] result = (Object[]) r;
3571357c85a7 Bugfix: Removed endless loop and a bug while iterating over Hibernate results.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents: 344
diff changeset
520
326
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
521 double km = (Double) result[0];
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
522 Double w = (Double) result[1];
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
523 Double q = (Double) result[2];
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
524 int columnNo = (Integer)result[3];
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
525
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
526 if (columnNo > lastColumnNo) { // new row
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
527 if (row != null) {
335
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
528 row.qSorted = qSorted;
326
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
529 valueTable.rows.add(row);
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
530 }
335
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
531 row = new Row(
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
532 km,
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
533 new double[columnNo+1],
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
534 new double[columnNo+1]);
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
535 lastQ = -Double.MAX_VALUE;
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
536 qSorted = true;
326
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
537 }
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
538
335
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
539 row.ws[columnNo] = w != null ? w : Double.NaN;
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
540 row.qs[columnNo] = q != null ? q : Double.NaN;
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
541
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
542 if (qSorted && (q == null || lastQ > q)) {
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
543 qSorted = false;
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
544 }
64cfbd631f29 Implemented the "Wasserstand/Wasserspiegellagen" calculation.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 327
diff changeset
545 lastQ = q;
326
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 lastColumnNo = columnNo;
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
548 }
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
549
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
550 if (row != null) {
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
551 valueTable.rows.add(row);
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
552 }
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
553
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
554 return valueTable;
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
555 }
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
556 }
07eba6d3b4a5 Fetches w/q value tables from the backend.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
557 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org