comparison flys-artifacts/src/main/java/de/intevation/flys/artifacts/WINFOArtifact.java @ 2415:64dd65aa620d

Partial fix for flys/issue499 flys-artifacts/trunk@4046 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Mon, 13 Feb 2012 17:49:04 +0000
parents c321b39b39ab
children 899ca89f497e
comparison
equal deleted inserted replaced
2414:b5f5af53a526 2415:64dd65aa620d
367 if (qs == null) { 367 if (qs == null) {
368 logger.debug("Determine Q values based on a set of W values."); 368 logger.debug("Determine Q values based on a set of W values.");
369 qSel = false; 369 qSel = false;
370 ws = getWs(); 370 ws = getWs();
371 double [][] qws = getQsForWs(ws); 371 double [][] qws = getQsForWs(ws);
372 if (qws == null) { 372 if (qws == null || qws.length == 0) {
373 return error(new WQKms[0], "converting.ws.to.qs.failed"); 373 return error(new WQKms[0], "converting.ws.to.qs.failed");
374 } 374 }
375 qs = qws[0]; 375 qs = qws[0];
376 376
377 if (qws[1] != null) { // If new ws where generated. 377 if (qws[1] != null) { // If new ws where generated.
727 logger.debug("Reference end km : " + sd.getValue()); 727 logger.debug("Reference end km : " + sd.getValue());
728 } 728 }
729 729
730 String input = (String) sd.getValue(); 730 String input = (String) sd.getValue();
731 731
732 if (input == null | (input = input.trim()).length() == 0) { 732 if (input == null || (input = input.trim()).length() == 0) {
733 logger.warn("reference end string is empty."); 733 logger.warn("reference end string is empty.");
734 return null; 734 return null;
735 } 735 }
736 736
737 TDoubleArrayList endKms = new TDoubleArrayList(); 737 TDoubleArrayList endKms = new TDoubleArrayList();
847 * 847 *
848 * @return an array of Q values. 848 * @return an array of Q values.
849 */ 849 */
850 public double [][] getQsForWs(double[] ws) { 850 public double [][] getQsForWs(double[] ws) {
851 851
852 if (ws == null) {
853 logger.error("getQsForWs: ws == null");
854 return null;
855 }
856
852 boolean debug = logger.isDebugEnabled(); 857 boolean debug = logger.isDebugEnabled();
853 858
854 if (debug) { 859 if (debug) {
855 logger.debug("FLYSArtifact.getQsForWs"); 860 logger.debug("FLYSArtifact.getQsForWs");
856 } 861 }
866 logger.warn("no ranges found"); 871 logger.warn("no ranges found");
867 return null; 872 return null;
868 } 873 }
869 874
870 if (isFreeW()) { 875 if (isFreeW()) {
876 logger.debug("Bezugslinienverfahren I: W auf freier Strecke");
871 // The simple case of the "Bezugslinienverfahren" 877 // The simple case of the "Bezugslinienverfahren"
872 // "W auf freier Strecke". 878 // "W auf freier Strecke".
873 WstValueTable wst = WstValueTableFactory.getTable(r); 879 WstValueTable wst = WstValueTableFactory.getTable(r);
874 if (wst == null) { 880 if (wst == null) {
875 logger.warn("no wst value table found"); 881 logger.warn("no wst value table found");
881 TDoubleArrayList outWs = new TDoubleArrayList(ws.length); 887 TDoubleArrayList outWs = new TDoubleArrayList(ws.length);
882 888
883 boolean generatedWs = false; 889 boolean generatedWs = false;
884 890
885 for (int i = 0; i < ws.length; ++i) { 891 for (int i = 0; i < ws.length; ++i) {
892 double w = ws[i];
893 if (debug) {
894 logger.debug("getQsForWs: lookup Q for W: " + w);
895 }
886 // There could bemore than one Q per W. 896 // There could bemore than one Q per W.
887 double [] qs = wst.findQsForW(km, ws[i]); 897 double [] qs = wst.findQsForW(km, w);
888 for (int j = 0; j < qs.length; ++j) { 898 for (int j = 0; j < qs.length; ++j) {
889 outWs.add(ws[i]); 899 outWs.add(ws[i]);
890 outQs.add(qs[j]); 900 outQs.add(qs[j]);
891 } 901 }
892 generatedWs |= qs.length != 1; 902 generatedWs |= qs.length != 1;
893 } 903 }
894 904
905 if (debug) {
906 logger.debug("getQsForWs: number of Qs: " + outQs.size());
907 }
908
895 return new double [][] { 909 return new double [][] {
896 outQs.toNativeArray(), 910 outQs.toNativeArray(),
897 generatedWs ? outWs.toNativeArray() : null }; 911 generatedWs ? outWs.toNativeArray() : null };
898 } 912 }
899 913
915 Map<String, double [][]> tmp = dt.getValues(); 929 Map<String, double [][]> tmp = dt.getValues();
916 930
917 double[][] values = tmp.get(g.getName()); 931 double[][] values = tmp.get(g.getName());
918 double[] qs = new double[ws.length]; 932 double[] qs = new double[ws.length];
919 933
934 TDoubleArrayList wsOut = new TDoubleArrayList(ws.length);
935 TDoubleArrayList qsOut = new TDoubleArrayList(ws.length);
936
920 for (int i = 0; i < ws.length; i++) { 937 for (int i = 0; i < ws.length; i++) {
921 qs[i] = dt.getQForW(values, ws[i]); 938 if (Double.isNaN(ws[i])) {
939 logger.warn("W is NaN: ignored");
940 continue;
941 }
942 double w = ws[i] / 100.0;
943 double q = dt.getQForW(values, w);
944 if (Double.isNaN(q)) {
945 logger.warn("No Q found for W = " + ws[i]);
946 continue;
947 }
948 wsOut.add(w);
949 qsOut.add(q);
922 if (debug) { 950 if (debug) {
923 logger.debug("w: " + ws[i] + " -> q: " + qs[i]); 951 logger.debug("w: " + w + " -> q: " + q);
924 } 952 }
925 } 953 }
926 954
927 return new double [][] { qs, null }; 955 return new double [][] {
956 qsOut.toNativeArray(),
957 wsOut.toNativeArray()
958 };
928 } 959 }
929 960
930 961
931 /** 962 /**
932 * Determines the selected mode of distance/range input. 963 * Determines the selected mode of distance/range input.
1102 return mode != null && mode.getValue().equals("Q"); 1133 return mode != null && mode.getValue().equals("Q");
1103 } 1134 }
1104 1135
1105 public boolean isFreeW() { 1136 public boolean isFreeW() {
1106 StateData mode = getData("wq_mode"); 1137 StateData mode = getData("wq_mode");
1107 return mode != null && mode.getValue().equals("FREEW"); 1138 return mode != null && mode.getValue().equals("WFREE");
1108 } 1139 }
1109 1140
1110 1141
1111 /** 1142 /**
1112 * Returns true, if the parameter is set to compute data on a free range. 1143 * Returns true, if the parameter is set to compute data on a free range.
1179 StateData dMode = getData("wq_mode"); 1210 StateData dMode = getData("wq_mode");
1180 StateData dSingle = getData("wq_single"); 1211 StateData dSingle = getData("wq_single");
1181 1212
1182 String mode = (dMode != null) ? (String) dMode.getValue() : ""; 1213 String mode = (dMode != null) ? (String) dMode.getValue() : "";
1183 1214
1184 if (mode.equals("W")) { 1215 if (mode.equals("W") || mode.equals("WFREE")) {
1185 if (dSingle != null) { 1216 if (dSingle != null) {
1186 return getSingleWQValues(); 1217 return getSingleWQValues();
1187 } 1218 }
1188 else { 1219 else {
1189 return getWQTriple(); 1220 return getWQTriple();

http://dive4elements.wald.intevation.org