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 :

http://dive4elements.wald.intevation.org