Mercurial > dive4elements > river
comparison flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/DischargeTables.java @ 329:0b2358bc716d
Discharge table: Added static method getWForQ() to interpolate a w value for a given q value based on a given discharge table.
flys-artifacts/trunk@1727 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Tue, 19 Apr 2011 11:05:27 +0000 |
parents | 07e642030172 |
children | 67b3f54188aa |
comparison
equal
deleted
inserted
replaced
328:07e642030172 | 329:0b2358bc716d |
---|---|
2 | 2 |
3 import java.util.List; | 3 import java.util.List; |
4 import java.util.Map; | 4 import java.util.Map; |
5 import java.util.HashMap; | 5 import java.util.HashMap; |
6 import java.util.Arrays; | 6 import java.util.Arrays; |
7 import java.util.Comparator; | |
7 | 8 |
8 import java.io.Serializable; | 9 import java.io.Serializable; |
9 | 10 |
10 import org.hibernate.Session; | 11 import org.hibernate.Session; |
11 import org.hibernate.Query; | 12 import org.hibernate.Query; |
18 import de.intevation.flys.model.DischargeTableValue; | 19 import de.intevation.flys.model.DischargeTableValue; |
19 | 20 |
20 public class DischargeTables | 21 public class DischargeTables |
21 implements Serializable | 22 implements Serializable |
22 { | 23 { |
24 private static Logger log = Logger.getLogger(DischargeTables.class); | |
25 | |
23 public static final double DEFAULT_SCALE = 100.0; | 26 public static final double DEFAULT_SCALE = 100.0; |
24 | 27 |
25 public static final int MASTER = 0; | 28 public static final int MASTER = 0; |
26 | 29 |
27 private static Logger log = Logger.getLogger(DischargeTables.class); | 30 public static final double EPSILON = 1e-5; |
31 | |
32 public static Comparator<double []> Q_COMPARATOR = | |
33 new Comparator<double []>() { | |
34 public int compare(double [] a, double [] b) { | |
35 double d = a[0] - b[0]; | |
36 if (d < -EPSILON) return -1; | |
37 if (d > +EPSILON) return +1; | |
38 return 0; | |
39 } | |
40 }; | |
28 | 41 |
29 protected List<String> gaugeNames; | 42 protected List<String> gaugeNames; |
30 | 43 |
31 protected String riverName; | 44 protected String riverName; |
32 | 45 |
131 vs[0][idx] = dtv.getQ().doubleValue() * scale; | 144 vs[0][idx] = dtv.getQ().doubleValue() * scale; |
132 vs[1][idx] = dtv.getW().doubleValue() * scale; | 145 vs[1][idx] = dtv.getW().doubleValue() * scale; |
133 ++idx; | 146 ++idx; |
134 } | 147 } |
135 | 148 |
149 // TODO: Do this db level. | |
150 Arrays.sort(vs, Q_COMPARATOR); | |
151 | |
136 values.put(gaugeName, vs); | 152 values.put(gaugeName, vs); |
137 } | 153 } |
138 | 154 |
139 return values; | 155 return values; |
140 } | 156 } |
157 | |
158 public static boolean getWForQ( | |
159 double [][] values, | |
160 double q, | |
161 double [] result | |
162 ) { | |
163 int index = Arrays.binarySearch(values, new double [] { q }, Q_COMPARATOR); | |
164 if (index >= 0) { | |
165 result[0] = values[1][index]; | |
166 return true; | |
167 } | |
168 | |
169 index = -index - 1; // insert position | |
170 | |
171 if (index == 0 || index+1 >= values.length) { | |
172 // do not extraploate | |
173 return false; | |
174 } | |
175 | |
176 double q1 = values[index ][0]; | |
177 double q2 = values[index+1][0]; | |
178 double w1 = values[index ][1]; | |
179 double w2 = values[index+1][1]; | |
180 | |
181 // w1 = m*q1 + b | |
182 // w2 = m*q2 + b | |
183 // w2 - w1 = m*(q2 - q1) | |
184 // m = (w2 - w1)/(q2 - q1) # q2 != q1 | |
185 // b = w1 - m*q1 | |
186 | |
187 if (q1 == q2) { | |
188 result[0] = 0.5*(w1 + w2); | |
189 } | |
190 else { | |
191 double m = (w2 - w1)/(q2 - q1); | |
192 double b = w1 - m*q1; | |
193 result[0] = q*m + b; | |
194 } | |
195 | |
196 return true; | |
197 } | |
141 } | 198 } |
142 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : | 199 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : |