Mercurial > dive4elements > river
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 |