comparison artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhcalculation/TkhCalculator.java @ 8946:5d5d482da3e9

Implementing SINFO - FlowDepthMinMax calculation
author gernotbelger
date Tue, 13 Mar 2018 18:49:33 +0100
parents 82998242ba84
children a4f1ac81f26d
comparison
equal deleted inserted replaced
8945:4a6b6a3c279c 8946:5d5d482da3e9
9 */ 9 */
10 package org.dive4elements.river.artifacts.sinfo.tkhcalculation; 10 package org.dive4elements.river.artifacts.sinfo.tkhcalculation;
11 11
12 import org.apache.commons.lang.math.DoubleRange; 12 import org.apache.commons.lang.math.DoubleRange;
13 import org.apache.commons.math.ArgumentOutsideDomainException; 13 import org.apache.commons.math.ArgumentOutsideDomainException;
14 import org.apache.commons.math.FunctionEvaluationException;
15 import org.dive4elements.artifacts.CallContext; 14 import org.dive4elements.artifacts.CallContext;
16 import org.dive4elements.river.artifacts.model.Calculation; 15 import org.dive4elements.river.artifacts.model.Calculation;
17 import org.dive4elements.river.artifacts.resources.Resources; 16 import org.dive4elements.river.artifacts.resources.Resources;
18 import org.dive4elements.river.artifacts.sinfo.tkhstate.BedHeightsFinder; 17 import org.dive4elements.river.artifacts.sinfo.tkhstate.BedHeightsFinder;
19 import org.dive4elements.river.model.River; 18 import org.dive4elements.river.model.River;
35 34
36 private final SoilKindKmValueFinder soilKindFinder; 35 private final SoilKindKmValueFinder soilKindFinder;
37 36
38 private final BedHeightsFinder bedHeightsProvider; 37 private final BedHeightsFinder bedHeightsProvider;
39 38
39 private final WaterlevelValuesFinder waterlevelProvider;
40
40 private final DischargeValuesFinder dischargeProvider; 41 private final DischargeValuesFinder dischargeProvider;
41 42
42 private final FlowVelocityModelKmValueFinder flowVelocitiesFinder; 43 private final FlowVelocityModelKmValueFinder flowVelocitiesFinder;
43 44
44 public static TkhCalculator buildTkhCalculator(final boolean useTkh, final CallContext context, final Calculation problems, final String label, 45 public static TkhCalculator buildTkhCalculator(final boolean useTkh, final CallContext context, final Calculation problems, final String label,
45 final River river, final DoubleRange calcRange, final DischargeValuesFinder dischargeProvider, final BedHeightsFinder bedHeightsProvider) { 46 final River river, final DoubleRange calcRange, final WaterlevelValuesFinder waterlevelProvider, final DischargeValuesFinder dischargeProvider,
47 final BedHeightsFinder bedHeightsProvider) {
46 48
47 if (!useTkh) 49 if (!useTkh)
48 return null; 50 return new TkhCalculator(problems, label, context, null, waterlevelProvider, dischargeProvider, bedHeightsProvider, null, null);
49 51
50 if (!dischargeProvider.isValid()) { 52 if (!dischargeProvider.isValid()) {
51 final String message = Resources.getMsg(context.getMeta(), "sinfo_calc_flow_depth.warning.missingQ", null, label); 53 final String message = Resources.getMsg(context.getMeta(), "sinfo_calc_flow_depth.warning.missingQ", null, label);
52 problems.addProblem(message); 54 problems.addProblem(message);
53 return null; 55 return new TkhCalculator(problems, label, context, null, waterlevelProvider, dischargeProvider, bedHeightsProvider, null, null);
54 } 56 }
55 57
56 final Integer soundingYear = bedHeightsProvider.getInfo().getYear(); 58 final int soundingYear = bedHeightsProvider.getInfo().getYear();
57 final BedQualityD50KmValueFinder bedMeasurementsFinder = BedQualityD50KmValueFinder.loadBedMeasurements(river, calcRange, soundingYear, 59 final BedQualityD50KmValueFinder bedMeasurementsFinder = BedQualityD50KmValueFinder.loadBedMeasurements(river, calcRange, soundingYear,
58 VALID_BED_MEASUREMENT_YEARS); 60 VALID_BED_MEASUREMENT_YEARS);
59 61
60 if (bedMeasurementsFinder == null) { 62 if (bedMeasurementsFinder == null) {
61 final String message = Resources.getMsg(context.getMeta(), "sinfo_calc_flow_depth.warning.missingD50", null, label); 63 final String message = Resources.getMsg(context.getMeta(), "sinfo_calc_flow_depth.warning.missingD50", null, label);
62 problems.addProblem(message); 64 problems.addProblem(message);
63 return null; 65 return new TkhCalculator(problems, label, context, null, waterlevelProvider, dischargeProvider, bedHeightsProvider, null, null);
64 } 66 }
65 67
66 // FIXME: wie wird ggf. interpoliert? prüfung ob werte vorhanden? 68 // FIXME: wie wird ggf. interpoliert? prüfung ob werte vorhanden?
67 final SoilKindKmValueFinder soilKindFinder = SoilKindKmValueFinder.loadValues(river, calcRange); 69 final SoilKindKmValueFinder soilKindFinder = SoilKindKmValueFinder.loadValues(river, calcRange);
68 if (soilKindFinder == null) { 70 if (soilKindFinder == null) {
69 final String message = Resources.getMsg(context.getMeta(), "sinfo_calc_flow_depth.warning.missingSoilKind", null, label); 71 final String message = Resources.getMsg(context.getMeta(), "sinfo_calc_flow_depth.warning.missingSoilKind", null, label);
70 problems.addProblem(message); 72 problems.addProblem(message);
71 return null; 73 return new TkhCalculator(problems, label, context, null, waterlevelProvider, dischargeProvider, bedHeightsProvider, null, null);
72 } 74 }
73 75
74 final DoubleRange qRange = dischargeProvider.getRange(); 76 final DoubleRange qRange = dischargeProvider.getRange();
75 final FlowVelocityModelKmValueFinder flowVelocitiesFinder = FlowVelocityModelKmValueFinder.loadValues(river, calcRange, qRange); 77 final FlowVelocityModelKmValueFinder flowVelocitiesFinder = FlowVelocityModelKmValueFinder.loadValues(river, calcRange, qRange);
76 if (flowVelocitiesFinder == null) { 78 if (flowVelocitiesFinder == null) {
77 final String message = Resources.getMsg(context.getMeta(), "sinfo_calc_flow_depth.warning.missingVelocity", null, label); 79 final String message = Resources.getMsg(context.getMeta(), "sinfo_calc_flow_depth.warning.missingVelocity", null, label);
78 problems.addProblem(message); 80 problems.addProblem(message);
79 return null; 81 return new TkhCalculator(problems, label, context, null, waterlevelProvider, dischargeProvider, bedHeightsProvider, null, null);
80 } 82 }
81 83
82 return new TkhCalculator(problems, label, context, bedMeasurementsFinder, dischargeProvider, bedHeightsProvider, soilKindFinder, flowVelocitiesFinder); 84 return new TkhCalculator(problems, label, context, bedMeasurementsFinder, waterlevelProvider, dischargeProvider, bedHeightsProvider, soilKindFinder,
85 flowVelocitiesFinder);
83 } 86 }
84 87
85 private TkhCalculator(final Calculation problems, final String problemLabel, final CallContext context, 88 private TkhCalculator(final Calculation problems, final String problemLabel, final CallContext context,
86 final BedQualityD50KmValueFinder bedMeasurementsFinder, final DischargeValuesFinder dischargeProvider, final BedHeightsFinder bedHeightsProvider, 89 final BedQualityD50KmValueFinder bedMeasurementsFinder, final WaterlevelValuesFinder waterlevelProvider,
87 final SoilKindKmValueFinder soilKindFinder, 90 final DischargeValuesFinder dischargeProvider, final BedHeightsFinder bedHeightsProvider, final SoilKindKmValueFinder soilKindFinder,
88 final FlowVelocityModelKmValueFinder flowVelocitiesFinder) { 91 final FlowVelocityModelKmValueFinder flowVelocitiesFinder) {
89 this.problems = problems; 92 this.problems = problems;
90 this.problemLabel = problemLabel; 93 this.problemLabel = problemLabel;
91 this.context = context; 94 this.context = context;
92 this.bedMeasurementsFinder = bedMeasurementsFinder; 95 this.bedMeasurementsFinder = bedMeasurementsFinder;
96 this.waterlevelProvider = waterlevelProvider;
93 this.dischargeProvider = dischargeProvider; 97 this.dischargeProvider = dischargeProvider;
94 this.bedHeightsProvider = bedHeightsProvider; 98 this.bedHeightsProvider = bedHeightsProvider;
95 this.soilKindFinder = soilKindFinder; 99 this.soilKindFinder = soilKindFinder;
96 this.flowVelocitiesFinder = flowVelocitiesFinder; 100 this.flowVelocitiesFinder = flowVelocitiesFinder;
97 } 101 }
98 102
99 private double getDischarge(final double km) { 103 public boolean hasTkh() {
100 104
101 try { 105 if (this.dischargeProvider == null || !this.dischargeProvider.isValid())
102 return this.dischargeProvider.getDischarge(km); 106 return false;
103 } 107
104 catch (final FunctionEvaluationException e) { 108 if (this.bedMeasurementsFinder == null)
105 // TODO: exceptions nicht komplett schlucken? evtl. mit log.debug(e) ausgeben 109 return false;
106 return Double.NaN; 110
107 } 111 if (this.soilKindFinder == null)
112 return false;
113
114 if (this.flowVelocitiesFinder == null)
115 return false;
116
117 return true;
108 } 118 }
109 119
110 private SoilKind getSoilKind(final double km) { 120 private SoilKind getSoilKind(final double km) {
111 121
112 try { 122 try {
132 142
133 return Double.NaN; 143 return Double.NaN;
134 } 144 }
135 } 145 }
136 146
137 public Tkh getTkh(final double km, final double wst) { 147 public Tkh getTkh(final double km) {
138 148
139 final SoilKind kind = getSoilKind(km); 149 final SoilKind kind = getSoilKind(km);
140 150
151 final double wst = this.waterlevelProvider.getWaterlevel(km);
152
141 final double meanBedHeight = this.bedHeightsProvider.getMeanBedHeight(km); 153 final double meanBedHeight = this.bedHeightsProvider.getMeanBedHeight(km);
142 154
143 final double flowDepth = wst - meanBedHeight; 155 final double flowDepth = wst - meanBedHeight;
144 156
145 final double discharge = getDischarge(km); 157 final double discharge = this.dischargeProvider.getDischarge(km);
146 if (Double.isNaN(discharge)) { 158 if (Double.isNaN(discharge))
147
148 // final String message = Resources.getMsg(this.context.getMeta(), "sinfo_calc_flow_depth.warning.missingQ", null,
149 // this.problemLabel);
150 // this.problems.addProblem(km, message);
151
152 // TODO: nochmal gemeinsam überlegen welche probleme wir loggen, an dieser stelle müsste man ggf. die station
153 // mitausgeben
154
155 return new Tkh(km, wst, meanBedHeight, flowDepth, Double.NaN, kind); 159 return new Tkh(km, wst, meanBedHeight, flowDepth, Double.NaN, kind);
156 } 160
161 if (!this.hasTkh())
162 return new Tkh(km, wst, meanBedHeight, flowDepth, Double.NaN, kind);
157 163
158 final double d50 = getBedMeasurement(km); 164 final double d50 = getBedMeasurement(km);
159 if (Double.isNaN(d50)) 165 if (Double.isNaN(d50))
160 return new Tkh(km, wst, meanBedHeight, flowDepth, discharge, kind); 166 return new Tkh(km, wst, meanBedHeight, flowDepth, discharge, kind);
161 167

http://dive4elements.wald.intevation.org