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 :

http://dive4elements.wald.intevation.org