Mercurial > dive4elements > river
comparison flys-artifacts/src/main/java/org/dive4elements/river/artifacts/model/WaterlevelFacet.java @ 5831:bd047b71ab37
Repaired internal references
author | Sascha L. Teichmann <teichmann@intevation.de> |
---|---|
date | Thu, 25 Apr 2013 12:06:39 +0200 |
parents | flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/WaterlevelFacet.java@3c7e7d47939f |
children |
comparison
equal
deleted
inserted
replaced
5830:160f53ee0870 | 5831:bd047b71ab37 |
---|---|
1 package org.dive4elements.river.artifacts.model; | |
2 | |
3 import org.dive4elements.artifactdatabase.state.Facet; | |
4 import org.dive4elements.artifacts.Artifact; | |
5 import org.dive4elements.artifacts.CallContext; | |
6 import org.dive4elements.river.artifacts.FLYSArtifact; | |
7 import org.dive4elements.river.artifacts.math.Linear; | |
8 import org.dive4elements.river.artifacts.states.DefaultState.ComputeType; | |
9 import org.dive4elements.river.artifacts.model.extreme.ExtremeResult; | |
10 | |
11 import org.apache.log4j.Logger; | |
12 | |
13 /** | |
14 * Facet of a Waterlevel (WQKms). | |
15 */ | |
16 public class WaterlevelFacet extends DataFacet { | |
17 | |
18 private static Logger logger = Logger.getLogger(WaterlevelFacet.class); | |
19 | |
20 public WaterlevelFacet(int index, String name, String description) { | |
21 super(index, name, description, ComputeType.ADVANCE, null, null); | |
22 } | |
23 | |
24 public WaterlevelFacet( | |
25 int index, | |
26 String name, | |
27 String description, | |
28 ComputeType type, | |
29 String stateID, | |
30 String hash | |
31 ) { | |
32 super(index, name, description, type, hash, stateID); | |
33 } | |
34 | |
35 public WaterlevelFacet() { | |
36 } | |
37 | |
38 protected WQKms [] getWQKms(CalculationResult res) { | |
39 if (res.getData() instanceof ExtremeResult) | |
40 return ((ExtremeResult) res.getData()).getWQKms(); | |
41 else if (res.getData() instanceof WQKms[]) { | |
42 return (WQKms []) res.getData(); | |
43 } | |
44 else { | |
45 logger.error("WaterlevelFacet got wrong data type " + res.getData()); | |
46 return null; | |
47 } | |
48 } | |
49 | |
50 /** | |
51 * Get waterlevel data. | |
52 * @return a WQKms at given index. | |
53 */ | |
54 @Override | |
55 public Object getData(Artifact artifact, CallContext context) { | |
56 | |
57 if (logger.isDebugEnabled()) { | |
58 logger.debug("Get data for waterlevels at index: " + index + | |
59 " /stateId: " + stateId); | |
60 } | |
61 | |
62 if (artifact == null) { | |
63 logger.error("WaterlevelFacet.getData: artifact is null"); | |
64 return null; | |
65 } | |
66 | |
67 FLYSArtifact winfo = (FLYSArtifact) artifact; | |
68 | |
69 CalculationResult res = (CalculationResult) | |
70 winfo.compute(context, hash, stateId, type, false); | |
71 | |
72 if (res == null) { | |
73 logger.error("WaterlevelFacet.getData: null result"); | |
74 return null; | |
75 } | |
76 | |
77 WQKms [] wqkms = getWQKms(res); | |
78 Object KM = context.getContextValue("currentKm"); | |
79 | |
80 // Interpolation. | |
81 if (KM != null) { | |
82 linearInterpolate(wqkms[index], (Double) KM); | |
83 } | |
84 else { | |
85 logger.debug("Do not interpolate."); | |
86 } | |
87 | |
88 return wqkms != null ? wqkms[index] : null; | |
89 } | |
90 | |
91 | |
92 /** | |
93 * Linear interpolation of WQKms. | |
94 * TODO rewrite. | |
95 * @return [w, q, km] | |
96 */ | |
97 public WQKms linearInterpolate(WQKms wqkms, double km) { | |
98 logger.debug("interpolate at given km (" + km + ")"); | |
99 | |
100 WQKms resultWQKms = new WQKms(); | |
101 int size = wqkms.size(); | |
102 boolean kmIncreasing = wqkms.getKm(0) < wqkms.getKm(size-1); | |
103 int mod = kmIncreasing ? +1 : -1; | |
104 int idx = 0; | |
105 // Move idx to closest from one direction, check for match. | |
106 if (!kmIncreasing) { | |
107 while (idx < size && wqkms.getKm(idx) < km) { | |
108 if (Math.abs(wqkms.getKm(idx) - km) < 0.01d) { | |
109 resultWQKms.add(wqkms.getW(idx), wqkms.getQ(idx), wqkms.getKm(idx)); | |
110 return resultWQKms; | |
111 } | |
112 idx++; | |
113 } | |
114 } | |
115 else { | |
116 idx = size-1; | |
117 while (idx > 0 && wqkms.getKm(idx) > km) { | |
118 if (Math.abs(wqkms.getKm(idx) - km) < 0.01d) { | |
119 resultWQKms.add(wqkms.getW(idx), wqkms.getQ(idx), wqkms.getKm(idx)); | |
120 return resultWQKms; | |
121 } | |
122 idx--; | |
123 } | |
124 } | |
125 if (Math.abs(wqkms.getKm(idx) - km) < 0.01d) { | |
126 resultWQKms.add(wqkms.getW(idx), wqkms.getQ(idx), wqkms.getKm(idx)); | |
127 return resultWQKms; | |
128 } | |
129 | |
130 if ((idx != -1) && (idx < size) && (idx - mod != -1) && (idx - mod < size)) { | |
131 double inW = Linear.linear( | |
132 km, | |
133 wqkms.getKm(idx), wqkms.getKm(idx - mod), | |
134 wqkms.getW(idx), wqkms.getW(idx - mod)); | |
135 double inQ = Linear.linear( | |
136 km, | |
137 wqkms.getKm(idx), wqkms.getKm(idx - mod), | |
138 wqkms.getQ(idx), wqkms.getQ(idx - mod)); | |
139 resultWQKms.add(inW, inQ, km); | |
140 } | |
141 else { | |
142 logger.debug("waterlevelfacet stuff " + idx + " size " + size + " mod: " + mod); | |
143 } | |
144 | |
145 return resultWQKms; | |
146 } | |
147 | |
148 | |
149 /** Copy deeply. */ | |
150 @Override | |
151 public Facet deepCopy() { | |
152 WaterlevelFacet copy = new WaterlevelFacet(); | |
153 copy.set(this); | |
154 copy.type = type; | |
155 copy.hash = hash; | |
156 copy.stateId = stateId; | |
157 return copy; | |
158 } | |
159 } | |
160 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : |