comparison flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/Calculation4.java @ 3441:bfbd478bd607

FixA: Moved Q -> W conversion code into segments to be reusable. flys-artifacts/trunk@5104 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Mon, 23 Jul 2012 14:19:07 +0000
parents cb11919cccf9
children 22790758b132
comparison
equal deleted inserted replaced
3440:fed6685692d2 3441:bfbd478bd607
1 package de.intevation.flys.artifacts.model; 1 package de.intevation.flys.artifacts.model;
2 2
3 import de.intevation.flys.artifacts.math.BackJumpCorrector;
4 import de.intevation.flys.artifacts.math.Function;
5 import de.intevation.flys.artifacts.math.Identity;
6 import de.intevation.flys.artifacts.math.Linear;
7
8 import de.intevation.flys.artifacts.model.WstValueTable.QPosition;
9
10 import de.intevation.flys.model.River;
11
12 import de.intevation.flys.utils.DoubleUtil;
13
14 import java.util.Arrays;
3 import java.util.List; 15 import java.util.List;
4 import java.util.Arrays;
5 import java.util.Collections;
6
7 import de.intevation.flys.utils.DoubleUtil;
8
9 import de.intevation.flys.model.River;
10 import de.intevation.flys.model.Gauge;
11 import de.intevation.flys.model.DischargeTable;
12
13 import de.intevation.flys.artifacts.model.WstValueTable.QPosition;
14
15 import de.intevation.flys.artifacts.math.Function;
16 import de.intevation.flys.artifacts.math.Linear;
17 import de.intevation.flys.artifacts.math.Identity;
18 import de.intevation.flys.artifacts.math.BackJumpCorrector;
19 16
20 import org.apache.log4j.Logger; 17 import org.apache.log4j.Logger;
21 18
22 public class Calculation4 19 public class Calculation4
23 extends Calculation 20 extends Calculation
36 public Calculation4(List<Segment> segments, River river, boolean isQ) { 33 public Calculation4(List<Segment> segments, River river, boolean isQ) {
37 34
38 this.segments = segments; 35 this.segments = segments;
39 this.isQ = isQ; 36 this.isQ = isQ;
40 37
41 int numResults = -1; 38 Segment.setReferencePointConvertQ(segments, river, isQ, this);
42
43 // assign reference points
44 for (Segment segment: segments) {
45 Gauge gauge = river.maxOverlap(segment.getFrom(), segment.getTo());
46
47 if (gauge == null) {
48 logger.warn("no gauge found. Defaults to mid point.");
49 segment.setReferencePoint(
50 0.5*(segment.getFrom()+segment.getTo()));
51 }
52 else {
53 double ref = gauge.getStation().doubleValue();
54 logger.debug(
55 "reference gauge: " + gauge.getName() +
56 " (km " + ref + ")");
57 segment.setReferencePoint(ref);
58 }
59
60 double [] values = segment.values;
61
62 if (numResults == -1) {
63 numResults = values.length;
64 }
65 else if (numResults != values.length) {
66 throw new IllegalArgumentException("wrong length of values");
67 }
68
69 // convert to Q if needed
70 if (!isQ && gauge != null) {
71
72 DischargeTable dt = gauge.fetchMasterDischargeTable();
73
74 double [][] table =
75 DischargeTables.loadDischargeTableValues(dt, 1);
76
77 // need the original values for naming
78 segment.backup();
79
80 for (int i = 0; i < values.length; ++i) {
81 double w = values[i] / 100.0;
82 double [] qs = DischargeTables.getQsForW(table, w);
83 if (qs.length == 0) {
84 logger.warn("No Qs found for W = " + values[i]);
85 addProblem("cannot.find.w.for.q", values[i]);
86 values[i] = Double.NaN;
87 }
88 else {
89 values[i] = qs[0];
90 if (qs.length > 1) {
91 logger.warn(
92 "More than one Q found for W = " + values[i]);
93 }
94 }
95 }
96 }
97 } // for all segments
98
99 Collections.sort(segments, Segment.REF_CMP);
100 } 39 }
101 40
102 public CalculationResult calculate( 41 public CalculationResult calculate(
103 WstValueTable table, 42 WstValueTable table,
104 double from, double to, double step 43 double from, double to, double step

http://dive4elements.wald.intevation.org