Mercurial > dive4elements > river
diff flys-artifacts/src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java @ 655:913b52064449
Refactored version of "Berechnung 4"
flys-artifacts/trunk@2053 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Sun, 05 Jun 2011 18:24:46 +0000 |
parents | 44175d4720f8 |
children | fdc898a134a7 |
line wrap: on
line diff
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java Fri Jun 03 10:21:13 2011 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java Sun Jun 05 18:24:46 2011 +0000 @@ -28,16 +28,15 @@ import de.intevation.flys.artifacts.states.DefaultState; import de.intevation.flys.artifacts.context.FLYSContext; -import de.intevation.flys.artifacts.math.BackJumpCorrector; + import de.intevation.flys.artifacts.model.MainValuesFactory; -import de.intevation.flys.artifacts.model.WQCKms; import de.intevation.flys.artifacts.model.WQDay; import de.intevation.flys.artifacts.model.WQKms; import de.intevation.flys.artifacts.model.WstValueTable; import de.intevation.flys.artifacts.model.WstValueTable.QPosition; import de.intevation.flys.artifacts.model.WstValueTableFactory; - -import de.intevation.flys.artifacts.math.LinearRemap; +import de.intevation.flys.artifacts.model.Calculation4; +import de.intevation.flys.artifacts.model.Segment; import gnu.trove.TDoubleArrayList; @@ -583,204 +582,31 @@ return new WQKms[0]; } - boolean kmUp = river.getKmUp(); - - WstValueTable wst = WstValueTableFactory.getTable(river); - if (wst == null) { + WstValueTable table = WstValueTableFactory.getTable(river); + if (table == null) { logger.error("No wst found for selected river."); return new WQKms[0]; } - double [][] segments = getRanges(); + List<Segment> segments = getSegments(); - if (logger.isDebugEnabled()) { - logger.debug("segments ----------------- enter"); - for (double [] segment: segments) { - logger.debug(" " + joinDoubles(segment)); - } - logger.debug("segments ----------------- leave"); - } - - if (segments.length < 1) { - logger.warn("no segments given"); + if (segments == null) { + logger.error("Cannot create segments."); return new WQKms[0]; } - if (segments.length == 1) { - // fall back to normal "Wasserstand/Wasserspiegellage" calculation - double [] qs = toQs(segments[0]); - if (qs == null) { - logger.warn("no qs given"); - return new WQKms[0]; - } - if (qs.length == 1) { - double [] kms = getKms(segments[0]); - HashSet<Integer> failed = new HashSet<Integer>(); - WQKms [] results = computeWaterlevelData - (kms, qs, wst, kmUp, failed); - setWaterlevelNames( - results, qs, isQ() ? "Q" : "W", failed); - return results; - } - } - - // more than one segment - - double [] boundKms = extractBoundsKm(river, segments); - - - if (logger.isDebugEnabled()) { - logger.debug("bound kms: " + joinDoubles(boundKms)); - } - - double [][] iqs = null; + double [] range = getFromToStep(); - for (int i = 0; i < segments.length; ++i) { - double [] iqsi = toQs(segments[i]); - if (iqsi == null) { - logger.warn("iqsi == null"); - return new WQKms[0]; - } - - if (iqs == null) { - iqs = new double[iqsi.length][boundKms.length]; - } - else if (iqs.length != iqsi.length) { - logger.warn("iqsi.logger != iqs.length: " - + iqsi.length + " " + iqsi.length); - return new WQKms[0]; - } - - if (logger.isDebugEnabled()) { - logger.debug("segments qs[ " + i + "]: " + joinDoubles(iqsi)); - } - - for (int j = 0; j < iqs.length; ++j) { - iqs[j][i] = iqsi[j]; - } - } - - if (logger.isDebugEnabled()) { - for (int i = 0; i < iqs.length; ++i) { - logger.debug("iqs[" + i + "]: " + joinDoubles(iqs[i])); - } + if (range == null) { + logger.error("Cannot figure out range."); + return new WQKms[0]; } - double [] boundWs = new double[boundKms.length]; - double [] boundQs = new double[boundKms.length]; - - double [] okms = getKms(new double [] { - boundKms[0], boundKms[boundKms.length-1] }); - - ArrayList<WQKms> results = new ArrayList<WQKms>(); - - int referenceIndex = kmUp ? 0 : boundKms.length-1; - - HashSet<Integer> failed = new HashSet<Integer>(); - - for (int i = 0; i < iqs.length; ++i) { - double [] iqsi = iqs[i]; - - QPosition qPosition = wst.interpolate( - iqsi[0], - boundKms[referenceIndex], - boundKms, boundWs, boundQs); - - if (qPosition == null) { - logger.warn("interpolation failed for " + iqsi[i]); - failed.add(i); - continue; - } - - LinearRemap remap = new LinearRemap(); - - for (int j = 1; j < boundKms.length; ++j) { - remap.add( - boundKms[j-1], boundKms[j], - boundQs[j-1], iqsi[j-1], - boundQs[j], iqsi[j]); - } - - double [] oqs = new double[okms.length]; - double [] ows = new double[okms.length]; - - wst.interpolate(okms, ows, oqs, qPosition, remap); - - BackJumpCorrector bjc = new BackJumpCorrector(); - if (bjc.doCorrection(okms, ows)) { - logger.debug("Discharge longitudinal section has backjumps."); - results.add(new WQCKms(okms, oqs, ows, bjc.getCorrected())); - } - else { - results.add(new WQKms(okms, oqs, ows)); - } - } - - WQKms [] wqkms = results.toArray(new WQKms[results.size()]); - - setDischargeLongitudinalSectionNames( - wqkms, iqs, isQ() ? "Q" : "W", failed); + Calculation4 calc4 = new Calculation4(segments, river, isQ()); - return wqkms; - } - - protected static String joinDoubles(double [] x) { - if (x == null) { - return ""; - } - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < x.length; ++i) { - if (i > 0) sb.append(", "); - sb.append(x[i]); - } - return sb.toString(); - } - - protected double [] toQs(double [] range) { - double [] qs = getQs(range); - if (qs == null) { - logger.debug("Determine Q values based on a set of W values."); - double [] ws = getWs(range); - qs = getQsForWs(ws); - } - return qs; - } - + WQKms [] results = calc4.calculate(table, range[0], range[1], range[2]); - /** - * Sets the name for discharge longitudinal section curves where each WQKms - * in <i>r</i> represents a column. - */ - public static void setDischargeLongitudinalSectionNames( - WQKms [] wqkms, - double [][] iqs, - String wq, - Set<Integer> failed - ) { - logger.debug("WINFOArtifact.setDischargeLongitudinalSectionNames"); - - // TODO: I18N - - int pos = 0; - - for (int j = 0; j < iqs.length; ++j) { - if (failed.contains(j)) { - continue; - } - StringBuilder sb = new StringBuilder(wq) - .append(" benutzerdefiniert ("); - - double [] iqsi = iqs[j]; - for (int i = 0; i < iqsi.length; i++) { - if (i > 0) { - sb.append("; "); - } - sb.append(iqsi[i]); - } - sb.append(")"); - - wqkms[pos++].setName(sb.toString()); - } + return results; } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :