annotate artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhcalculation/TkhCalculator.java @ 9530:144a184a414d

Tkh: d50 converted to mm for output
author mschaefer
date Tue, 02 Oct 2018 18:07:22 +0200
parents 23d97d60b889
children 8e6b9cb9486a
rev   line source
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
1 /** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
2 * Software engineering by
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
3 * Björnsen Beratende Ingenieure GmbH
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
4 * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
5 *
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
6 * This file is Free Software under the GNU AGPL (>=v3)
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
7 * and comes with ABSOLUTELY NO WARRANTY! Check out the
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
8 * documentation coming with Dive4Elements River for details.
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
9 */
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
10 package org.dive4elements.river.artifacts.sinfo.tkhcalculation;
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
11
9522
23d97d60b889 Selection range of D50 values for tkh calculation can now be configured with a river specific table.
gernotbelger
parents: 9503
diff changeset
12 import java.io.IOException;
23d97d60b889 Selection range of D50 values for tkh calculation can now be configured with a river specific table.
gernotbelger
parents: 9503
diff changeset
13
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
14 import org.apache.commons.lang.math.DoubleRange;
8997
d5802f22e4f5 Work on uinfo
gernotbelger
parents: 8978
diff changeset
15 import org.dive4elements.river.artifacts.common.GeneralResultType;
d5802f22e4f5 Work on uinfo
gernotbelger
parents: 8978
diff changeset
16 import org.dive4elements.river.artifacts.common.ResultRow;
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
17 import org.dive4elements.river.artifacts.model.Calculation;
8948
a4f1ac81f26d Work on SINFO-FlowDepthMinMax.
gernotbelger
parents: 8946
diff changeset
18 import org.dive4elements.river.artifacts.sinfo.common.SInfoResultType;
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
19 import org.dive4elements.river.artifacts.sinfo.tkhstate.BedHeightsFinder;
9522
23d97d60b889 Selection range of D50 values for tkh calculation can now be configured with a river specific table.
gernotbelger
parents: 9503
diff changeset
20 import org.dive4elements.river.artifacts.sinfo.tkhstate.BedQualityD50TimeRangeConfig.BedQualityParseException;
23d97d60b889 Selection range of D50 values for tkh calculation can now be configured with a river specific table.
gernotbelger
parents: 9503
diff changeset
21 import org.dive4elements.river.artifacts.sinfo.tkhstate.TsvHelper.TsvReaderException;
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
22 import org.dive4elements.river.model.River;
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
23
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
24 /**
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
25 * @author Gernot Belger
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
26 */
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
27 public final class TkhCalculator {
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
28
9335
7dc238bd062c Fixed: calculation of flow depth and tkh with rounding to cm, calculator return differentiated
mschaefer
parents: 9121
diff changeset
29 /**
7dc238bd062c Fixed: calculation of flow depth and tkh with rounding to cm, calculator return differentiated
mschaefer
parents: 9121
diff changeset
30 * Return type of the tkh calculation
7dc238bd062c Fixed: calculation of flow depth and tkh with rounding to cm, calculator return differentiated
mschaefer
parents: 9121
diff changeset
31 *
7dc238bd062c Fixed: calculation of flow depth and tkh with rounding to cm, calculator return differentiated
mschaefer
parents: 9121
diff changeset
32 */
7dc238bd062c Fixed: calculation of flow depth and tkh with rounding to cm, calculator return differentiated
mschaefer
parents: 9121
diff changeset
33 public enum TkhCalculateState {
7dc238bd062c Fixed: calculation of flow depth and tkh with rounding to cm, calculator return differentiated
mschaefer
parents: 9121
diff changeset
34 SUCCESS, NO_W, NO_BED_HEIGHT, NO_DISCHARGE, NO_SOILKIND, NO_D50, NO_VELOCITY, NO_TKH
7dc238bd062c Fixed: calculation of flow depth and tkh with rounding to cm, calculator return differentiated
mschaefer
parents: 9121
diff changeset
35 }
7dc238bd062c Fixed: calculation of flow depth and tkh with rounding to cm, calculator return differentiated
mschaefer
parents: 9121
diff changeset
36
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
37 private final BedQualityD50KmValueFinder bedMeasurementsFinder;
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
38
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
39 private final SoilKindKmValueFinder soilKindFinder;
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
40
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
41 private final BedHeightsFinder bedHeightsProvider;
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
42
8946
5d5d482da3e9 Implementing SINFO - FlowDepthMinMax calculation
gernotbelger
parents: 8940
diff changeset
43 private final WaterlevelValuesFinder waterlevelProvider;
5d5d482da3e9 Implementing SINFO - FlowDepthMinMax calculation
gernotbelger
parents: 8940
diff changeset
44
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
45 private final DischargeValuesFinder dischargeProvider;
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
46
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
47 private final FlowVelocityModelKmValueFinder flowVelocitiesFinder;
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
48
9481
787fc085459b TSV introduced; uinfo.inundationWMS-Config
gernotbelger
parents: 9375
diff changeset
49 public static TkhCalculator buildTkhCalculator(final boolean useTkh, final Calculation problems, final String label, final River river,
787fc085459b TSV introduced; uinfo.inundationWMS-Config
gernotbelger
parents: 9375
diff changeset
50 final DoubleRange calcRange, final WaterlevelValuesFinder waterlevelProvider, final DischargeValuesFinder dischargeProvider,
8946
5d5d482da3e9 Implementing SINFO - FlowDepthMinMax calculation
gernotbelger
parents: 8940
diff changeset
51 final BedHeightsFinder bedHeightsProvider) {
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
52
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
53 if (!useTkh)
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8954
diff changeset
54 return new TkhCalculator(null, waterlevelProvider, dischargeProvider, bedHeightsProvider, null, null);
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
55
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
56 if (!dischargeProvider.isValid()) {
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8954
diff changeset
57 problems.addProblem("sinfo_calc_flow_depth.warning.missingQ", label);
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8954
diff changeset
58 return new TkhCalculator(null, waterlevelProvider, dischargeProvider, bedHeightsProvider, null, null);
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
59 }
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
60
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8954
diff changeset
61 /* access bed quality data */
8946
5d5d482da3e9 Implementing SINFO - FlowDepthMinMax calculation
gernotbelger
parents: 8940
diff changeset
62 final int soundingYear = bedHeightsProvider.getInfo().getYear();
9522
23d97d60b889 Selection range of D50 values for tkh calculation can now be configured with a river specific table.
gernotbelger
parents: 9503
diff changeset
63 final BedQualityD50KmValueFinder bedMeasurementsFinder = loadBedMeasurementsFinder(problems, river, calcRange, soundingYear);
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8954
diff changeset
64 if (bedMeasurementsFinder == null)
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8954
diff changeset
65 return new TkhCalculator(null, waterlevelProvider, dischargeProvider, bedHeightsProvider, null, null);
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
66
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8954
diff changeset
67 /* access bed soil kind data */
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8954
diff changeset
68 final SoilKindKmValueFinder soilKindFinder = SoilKindKmValueFinder.loadValues(problems, river, calcRange);
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8954
diff changeset
69 if (soilKindFinder == null)
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8954
diff changeset
70 return new TkhCalculator(null, waterlevelProvider, dischargeProvider, bedHeightsProvider, null, null);
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
71
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
72 final DoubleRange qRange = dischargeProvider.getRange();
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8954
diff changeset
73 final FlowVelocityModelKmValueFinder flowVelocitiesFinder = FlowVelocityModelKmValueFinder.loadValues(problems, river, calcRange, qRange);
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8954
diff changeset
74 if (flowVelocitiesFinder == null)
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8954
diff changeset
75 return new TkhCalculator(null, waterlevelProvider, dischargeProvider, bedHeightsProvider, null, null);
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
76
9481
787fc085459b TSV introduced; uinfo.inundationWMS-Config
gernotbelger
parents: 9375
diff changeset
77 return new TkhCalculator(bedMeasurementsFinder, waterlevelProvider, dischargeProvider, bedHeightsProvider, soilKindFinder, flowVelocitiesFinder);
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
78 }
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
79
9522
23d97d60b889 Selection range of D50 values for tkh calculation can now be configured with a river specific table.
gernotbelger
parents: 9503
diff changeset
80 private static BedQualityD50KmValueFinder loadBedMeasurementsFinder(final Calculation problems, final River river, final DoubleRange calcRange,
23d97d60b889 Selection range of D50 values for tkh calculation can now be configured with a river specific table.
gernotbelger
parents: 9503
diff changeset
81 final int soundingYear) {
23d97d60b889 Selection range of D50 values for tkh calculation can now be configured with a river specific table.
gernotbelger
parents: 9503
diff changeset
82
23d97d60b889 Selection range of D50 values for tkh calculation can now be configured with a river specific table.
gernotbelger
parents: 9503
diff changeset
83 try {
23d97d60b889 Selection range of D50 values for tkh calculation can now be configured with a river specific table.
gernotbelger
parents: 9503
diff changeset
84 return BedQualityD50KmValueFinder.loadBedMeasurements(problems, river, calcRange, soundingYear);
23d97d60b889 Selection range of D50 values for tkh calculation can now be configured with a river specific table.
gernotbelger
parents: 9503
diff changeset
85 }
23d97d60b889 Selection range of D50 values for tkh calculation can now be configured with a river specific table.
gernotbelger
parents: 9503
diff changeset
86 catch (final BedQualityParseException | IOException | TsvReaderException e) {
23d97d60b889 Selection range of D50 values for tkh calculation can now be configured with a river specific table.
gernotbelger
parents: 9503
diff changeset
87 e.printStackTrace();
23d97d60b889 Selection range of D50 values for tkh calculation can now be configured with a river specific table.
gernotbelger
parents: 9503
diff changeset
88 return null;
23d97d60b889 Selection range of D50 values for tkh calculation can now be configured with a river specific table.
gernotbelger
parents: 9503
diff changeset
89 }
23d97d60b889 Selection range of D50 values for tkh calculation can now be configured with a river specific table.
gernotbelger
parents: 9503
diff changeset
90 }
23d97d60b889 Selection range of D50 values for tkh calculation can now be configured with a river specific table.
gernotbelger
parents: 9503
diff changeset
91
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8954
diff changeset
92 private TkhCalculator(final BedQualityD50KmValueFinder bedMeasurementsFinder, final WaterlevelValuesFinder waterlevelProvider,
8946
5d5d482da3e9 Implementing SINFO - FlowDepthMinMax calculation
gernotbelger
parents: 8940
diff changeset
93 final DischargeValuesFinder dischargeProvider, final BedHeightsFinder bedHeightsProvider, final SoilKindKmValueFinder soilKindFinder,
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
94 final FlowVelocityModelKmValueFinder flowVelocitiesFinder) {
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
95 this.bedMeasurementsFinder = bedMeasurementsFinder;
8946
5d5d482da3e9 Implementing SINFO - FlowDepthMinMax calculation
gernotbelger
parents: 8940
diff changeset
96 this.waterlevelProvider = waterlevelProvider;
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
97 this.dischargeProvider = dischargeProvider;
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
98 this.bedHeightsProvider = bedHeightsProvider;
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
99 this.soilKindFinder = soilKindFinder;
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
100 this.flowVelocitiesFinder = flowVelocitiesFinder;
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
101 }
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
102
8946
5d5d482da3e9 Implementing SINFO - FlowDepthMinMax calculation
gernotbelger
parents: 8940
diff changeset
103 public boolean hasTkh() {
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
104
8946
5d5d482da3e9 Implementing SINFO - FlowDepthMinMax calculation
gernotbelger
parents: 8940
diff changeset
105 if (this.dischargeProvider == null || !this.dischargeProvider.isValid())
5d5d482da3e9 Implementing SINFO - FlowDepthMinMax calculation
gernotbelger
parents: 8940
diff changeset
106 return false;
5d5d482da3e9 Implementing SINFO - FlowDepthMinMax calculation
gernotbelger
parents: 8940
diff changeset
107
5d5d482da3e9 Implementing SINFO - FlowDepthMinMax calculation
gernotbelger
parents: 8940
diff changeset
108 if (this.bedMeasurementsFinder == null)
5d5d482da3e9 Implementing SINFO - FlowDepthMinMax calculation
gernotbelger
parents: 8940
diff changeset
109 return false;
5d5d482da3e9 Implementing SINFO - FlowDepthMinMax calculation
gernotbelger
parents: 8940
diff changeset
110
5d5d482da3e9 Implementing SINFO - FlowDepthMinMax calculation
gernotbelger
parents: 8940
diff changeset
111 if (this.soilKindFinder == null)
5d5d482da3e9 Implementing SINFO - FlowDepthMinMax calculation
gernotbelger
parents: 8940
diff changeset
112 return false;
5d5d482da3e9 Implementing SINFO - FlowDepthMinMax calculation
gernotbelger
parents: 8940
diff changeset
113
5d5d482da3e9 Implementing SINFO - FlowDepthMinMax calculation
gernotbelger
parents: 8940
diff changeset
114 if (this.flowVelocitiesFinder == null)
5d5d482da3e9 Implementing SINFO - FlowDepthMinMax calculation
gernotbelger
parents: 8940
diff changeset
115 return false;
5d5d482da3e9 Implementing SINFO - FlowDepthMinMax calculation
gernotbelger
parents: 8940
diff changeset
116
5d5d482da3e9 Implementing SINFO - FlowDepthMinMax calculation
gernotbelger
parents: 8940
diff changeset
117 return true;
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
118 }
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
119
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
120 private SoilKind getSoilKind(final double km) {
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
121
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8954
diff changeset
122 if (this.soilKindFinder == null)
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8954
diff changeset
123 return null;
8954
183f42641ab6 Fixed: flowd depth calculation without transport bodies heights did not work any more
gernotbelger
parents: 8948
diff changeset
124
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8954
diff changeset
125 return this.soilKindFinder.findSoilKind(km);
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
126 }
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
127
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
128 private double getBedMeasurement(final double km) {
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8954
diff changeset
129 return this.bedMeasurementsFinder.findD50(km);
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
130 }
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
131
9335
7dc238bd062c Fixed: calculation of flow depth and tkh with rounding to cm, calculator return differentiated
mschaefer
parents: 9121
diff changeset
132 public TkhCalculateState calculateTkh(final double km, final ResultRow row) {
8948
a4f1ac81f26d Work on SINFO-FlowDepthMinMax.
gernotbelger
parents: 8946
diff changeset
133
8997
d5802f22e4f5 Work on uinfo
gernotbelger
parents: 8978
diff changeset
134 row.putValue(GeneralResultType.station, km);
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
135
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
136 final SoilKind kind = getSoilKind(km);
8948
a4f1ac81f26d Work on SINFO-FlowDepthMinMax.
gernotbelger
parents: 8946
diff changeset
137 row.putValue(SInfoResultType.soilkind, kind);
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
138
8946
5d5d482da3e9 Implementing SINFO - FlowDepthMinMax calculation
gernotbelger
parents: 8940
diff changeset
139 final double wst = this.waterlevelProvider.getWaterlevel(km);
8948
a4f1ac81f26d Work on SINFO-FlowDepthMinMax.
gernotbelger
parents: 8946
diff changeset
140 row.putValue(SInfoResultType.waterlevel, wst);
8978
b5600453bb8f SINFO Calculations: do not produce result rows if some input data has missing values.
gernotbelger
parents: 8964
diff changeset
141 if (Double.isNaN(wst))
9335
7dc238bd062c Fixed: calculation of flow depth and tkh with rounding to cm, calculator return differentiated
mschaefer
parents: 9121
diff changeset
142 return TkhCalculateState.NO_W;
8946
5d5d482da3e9 Implementing SINFO - FlowDepthMinMax calculation
gernotbelger
parents: 8940
diff changeset
143
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
144 final double meanBedHeight = this.bedHeightsProvider.getMeanBedHeight(km);
8948
a4f1ac81f26d Work on SINFO-FlowDepthMinMax.
gernotbelger
parents: 8946
diff changeset
145 row.putValue(SInfoResultType.meanBedHeight, meanBedHeight);
8978
b5600453bb8f SINFO Calculations: do not produce result rows if some input data has missing values.
gernotbelger
parents: 8964
diff changeset
146 if (Double.isNaN(meanBedHeight))
9335
7dc238bd062c Fixed: calculation of flow depth and tkh with rounding to cm, calculator return differentiated
mschaefer
parents: 9121
diff changeset
147 return TkhCalculateState.NO_BED_HEIGHT;
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
148
9503
83e6acdf8fc6 Fixed: no rounding during calculations (Meilenstein-2 2.9)
mschaefer
parents: 9481
diff changeset
149 final double flowDepth = wst - meanBedHeight;
8948
a4f1ac81f26d Work on SINFO-FlowDepthMinMax.
gernotbelger
parents: 8946
diff changeset
150 row.putValue(SInfoResultType.flowdepth, flowDepth);
8940
82998242ba84 Preparing for additional outputs of SINFO-Tkh
gernotbelger
parents: 8938
diff changeset
151
8946
5d5d482da3e9 Implementing SINFO - FlowDepthMinMax calculation
gernotbelger
parents: 8940
diff changeset
152 final double discharge = this.dischargeProvider.getDischarge(km);
8948
a4f1ac81f26d Work on SINFO-FlowDepthMinMax.
gernotbelger
parents: 8946
diff changeset
153 row.putValue(SInfoResultType.discharge, discharge);
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
154
8946
5d5d482da3e9 Implementing SINFO - FlowDepthMinMax calculation
gernotbelger
parents: 8940
diff changeset
155 if (!this.hasTkh())
9335
7dc238bd062c Fixed: calculation of flow depth and tkh with rounding to cm, calculator return differentiated
mschaefer
parents: 9121
diff changeset
156 return TkhCalculateState.SUCCESS;
8978
b5600453bb8f SINFO Calculations: do not produce result rows if some input data has missing values.
gernotbelger
parents: 8964
diff changeset
157
b5600453bb8f SINFO Calculations: do not produce result rows if some input data has missing values.
gernotbelger
parents: 8964
diff changeset
158 // Missing discharge or kind is only a problem if we want to calculate tkh
b5600453bb8f SINFO Calculations: do not produce result rows if some input data has missing values.
gernotbelger
parents: 8964
diff changeset
159 if (Double.isNaN(discharge))
9335
7dc238bd062c Fixed: calculation of flow depth and tkh with rounding to cm, calculator return differentiated
mschaefer
parents: 9121
diff changeset
160 return TkhCalculateState.NO_DISCHARGE;
8978
b5600453bb8f SINFO Calculations: do not produce result rows if some input data has missing values.
gernotbelger
parents: 8964
diff changeset
161 if (kind == null)
9335
7dc238bd062c Fixed: calculation of flow depth and tkh with rounding to cm, calculator return differentiated
mschaefer
parents: 9121
diff changeset
162 return TkhCalculateState.NO_SOILKIND;
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
163
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
164 final double d50 = getBedMeasurement(km);
9530
144a184a414d Tkh: d50 converted to mm for output
mschaefer
parents: 9522
diff changeset
165 row.putValue(SInfoResultType.d50, d50 * 1000);
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
166 if (Double.isNaN(d50))
9335
7dc238bd062c Fixed: calculation of flow depth and tkh with rounding to cm, calculator return differentiated
mschaefer
parents: 9121
diff changeset
167 return TkhCalculateState.NO_D50;
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
168
8964
45f1ad66560e Code cleanup concerning calculations: improved error handling; improved interpolation; bed heights are now always used for spatial discretisation
gernotbelger
parents: 8954
diff changeset
169 if (!this.flowVelocitiesFinder.findKmQValues(km, discharge))
9335
7dc238bd062c Fixed: calculation of flow depth and tkh with rounding to cm, calculator return differentiated
mschaefer
parents: 9121
diff changeset
170 return TkhCalculateState.NO_VELOCITY;
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
171
8940
82998242ba84 Preparing for additional outputs of SINFO-Tkh
gernotbelger
parents: 8938
diff changeset
172 final double velocity = this.flowVelocitiesFinder.getFindVmainFound();
8948
a4f1ac81f26d Work on SINFO-FlowDepthMinMax.
gernotbelger
parents: 8946
diff changeset
173 row.putValue(SInfoResultType.velocity, velocity);
8978
b5600453bb8f SINFO Calculations: do not produce result rows if some input data has missing values.
gernotbelger
parents: 8964
diff changeset
174 if (Double.isNaN(velocity))
9335
7dc238bd062c Fixed: calculation of flow depth and tkh with rounding to cm, calculator return differentiated
mschaefer
parents: 9121
diff changeset
175 return TkhCalculateState.NO_VELOCITY;
8948
a4f1ac81f26d Work on SINFO-FlowDepthMinMax.
gernotbelger
parents: 8946
diff changeset
176
8940
82998242ba84 Preparing for additional outputs of SINFO-Tkh
gernotbelger
parents: 8938
diff changeset
177 final double tau = this.flowVelocitiesFinder.getFindTauFound();
8948
a4f1ac81f26d Work on SINFO-FlowDepthMinMax.
gernotbelger
parents: 8946
diff changeset
178 row.putValue(SInfoResultType.tau, tau);
8978
b5600453bb8f SINFO Calculations: do not produce result rows if some input data has missing values.
gernotbelger
parents: 8964
diff changeset
179 if (Double.isNaN(tau))
9335
7dc238bd062c Fixed: calculation of flow depth and tkh with rounding to cm, calculator return differentiated
mschaefer
parents: 9121
diff changeset
180 return TkhCalculateState.NO_VELOCITY;
8940
82998242ba84 Preparing for additional outputs of SINFO-Tkh
gernotbelger
parents: 8938
diff changeset
181
9335
7dc238bd062c Fixed: calculation of flow depth and tkh with rounding to cm, calculator return differentiated
mschaefer
parents: 9121
diff changeset
182 final double tkh = calculateTkh(flowDepth, velocity, d50, tau);
8948
a4f1ac81f26d Work on SINFO-FlowDepthMinMax.
gernotbelger
parents: 8946
diff changeset
183 row.putValue(SInfoResultType.tkh, tkh);
8978
b5600453bb8f SINFO Calculations: do not produce result rows if some input data has missing values.
gernotbelger
parents: 8964
diff changeset
184 if (Double.isNaN(tkh))
9335
7dc238bd062c Fixed: calculation of flow depth and tkh with rounding to cm, calculator return differentiated
mschaefer
parents: 9121
diff changeset
185 return TkhCalculateState.NO_TKH;
8948
a4f1ac81f26d Work on SINFO-FlowDepthMinMax.
gernotbelger
parents: 8946
diff changeset
186
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
187 switch (kind) {
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
188 case starr:
9375
a0a2e68a1e11 Fixed: cm rounding in S-Info flow depth/tkh and U-Info salix via BigDecimal, half_even mode
mschaefer
parents: 9335
diff changeset
189 row.putValue(SInfoResultType.tkhup, Math.rint(tkh));
8948
a4f1ac81f26d Work on SINFO-FlowDepthMinMax.
gernotbelger
parents: 8946
diff changeset
190 row.putValue(SInfoResultType.tkhdown, 0.0);
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
191 break;
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
192
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
193 case mobil:
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
194 default:
9375
a0a2e68a1e11 Fixed: cm rounding in S-Info flow depth/tkh and U-Info salix via BigDecimal, half_even mode
mschaefer
parents: 9335
diff changeset
195 row.putValue(SInfoResultType.tkhup, Math.rint(tkh / 2));
a0a2e68a1e11 Fixed: cm rounding in S-Info flow depth/tkh and U-Info salix via BigDecimal, half_even mode
mschaefer
parents: 9335
diff changeset
196 row.putValue(SInfoResultType.tkhdown, -(Math.rint(tkh / 2)));
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
197 break;
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
198 }
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
199
9335
7dc238bd062c Fixed: calculation of flow depth and tkh with rounding to cm, calculator return differentiated
mschaefer
parents: 9121
diff changeset
200 final double flowDepthTkh = calculateFlowDepthTkh(tkh, kind, flowDepth);
8948
a4f1ac81f26d Work on SINFO-FlowDepthMinMax.
gernotbelger
parents: 8946
diff changeset
201 row.putValue(SInfoResultType.flowdepthtkh, flowDepthTkh);
8978
b5600453bb8f SINFO Calculations: do not produce result rows if some input data has missing values.
gernotbelger
parents: 8964
diff changeset
202
9335
7dc238bd062c Fixed: calculation of flow depth and tkh with rounding to cm, calculator return differentiated
mschaefer
parents: 9121
diff changeset
203 return TkhCalculateState.SUCCESS;
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
204 }
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
205
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
206 /**
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
207 * Calculates a transport body height
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
208 *
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
209 * @param h
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
210 * flow depth in m
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
211 * @param vm
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
212 * flow velocity in m
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
213 * @param d50
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
214 * grain diameter D50 in m (!)
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
215 * @param tau
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
216 * shear stress in N/m^2
8920
29442c03c6e3 d50 aggregation by median instead of arithmetic mean,
mschaefer
parents: 8916
diff changeset
217 * @return transport body height in cm (!), never negative
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
218 */
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
219 private double calculateTkh(final double h, final double vm, final double d50, final double tau) {
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
220 final double PHYS_G = 9.81;
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
221 final double PHYS_SPECGRAV_S = 2.6;
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
222 final double PHYS_VELOCCOEFF_N = 6;
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
223 final double PHYS_FORMCOEFF_ALPHA = 0.7;
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
224 final double PHYS_VISCOSITY_NUE = 1.3e-6;
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
225 final double PHYS_GRAIN_DENSITY_RHOS = 2603;
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
226 final double PHYS_WATER_DENSITY_RHO = 999.97;
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
227
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
228 final double froude = vm / Math.sqrt(PHYS_G * h);
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
229 final double partReynolds = Math.sqrt((PHYS_SPECGRAV_S - 1) * PHYS_G * d50) / PHYS_VISCOSITY_NUE * d50;
9121
8675912c7f48 Fixed tkh calculation (sign of an exponent of the critical shields term)
mschaefer
parents: 8997
diff changeset
230 final double critShields = 0.22 * Math.pow(partReynolds, -0.6) + 0.06 * Math.pow(10, -7.7 * Math.pow(partReynolds, -0.6));
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
231 final double critTau = critShields * (PHYS_GRAIN_DENSITY_RHOS - PHYS_WATER_DENSITY_RHO) * PHYS_G * d50;
8920
29442c03c6e3 d50 aggregation by median instead of arithmetic mean,
mschaefer
parents: 8916
diff changeset
232 final double tkh = 100 * h * (1 - Math.pow(froude, 2)) / (2 * PHYS_VELOCCOEFF_N * PHYS_FORMCOEFF_ALPHA) * (1 - critTau / tau);
29442c03c6e3 d50 aggregation by median instead of arithmetic mean,
mschaefer
parents: 8916
diff changeset
233 // Some regular input values may give a negative calculation result; that is unwanted
29442c03c6e3 d50 aggregation by median instead of arithmetic mean,
mschaefer
parents: 8916
diff changeset
234 if (tkh < 0.0)
29442c03c6e3 d50 aggregation by median instead of arithmetic mean,
mschaefer
parents: 8916
diff changeset
235 return 0.0;
8938
9c02733a1b3c Work on Sinfo-tkh - exports; using same logic for wst-description as winfo
gernotbelger
parents: 8920
diff changeset
236
9c02733a1b3c Work on Sinfo-tkh - exports; using same logic for wst-description as winfo
gernotbelger
parents: 8920
diff changeset
237 return tkh;
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
238 }
8940
82998242ba84 Preparing for additional outputs of SINFO-Tkh
gernotbelger
parents: 8938
diff changeset
239
9335
7dc238bd062c Fixed: calculation of flow depth and tkh with rounding to cm, calculator return differentiated
mschaefer
parents: 9121
diff changeset
240 private double calculateFlowDepthTkh(final double tkhValue, final SoilKind tkhKind, final double flowDepth) {
8940
82998242ba84 Preparing for additional outputs of SINFO-Tkh
gernotbelger
parents: 8938
diff changeset
241
82998242ba84 Preparing for additional outputs of SINFO-Tkh
gernotbelger
parents: 8938
diff changeset
242 switch (tkhKind) {
82998242ba84 Preparing for additional outputs of SINFO-Tkh
gernotbelger
parents: 8938
diff changeset
243 case starr:
9375
a0a2e68a1e11 Fixed: cm rounding in S-Info flow depth/tkh and U-Info salix via BigDecimal, half_even mode
mschaefer
parents: 9335
diff changeset
244 return flowDepth - Math.rint(tkhValue) / 100.0;
8940
82998242ba84 Preparing for additional outputs of SINFO-Tkh
gernotbelger
parents: 8938
diff changeset
245
82998242ba84 Preparing for additional outputs of SINFO-Tkh
gernotbelger
parents: 8938
diff changeset
246 case mobil:
82998242ba84 Preparing for additional outputs of SINFO-Tkh
gernotbelger
parents: 8938
diff changeset
247 default:
9375
a0a2e68a1e11 Fixed: cm rounding in S-Info flow depth/tkh and U-Info salix via BigDecimal, half_even mode
mschaefer
parents: 9335
diff changeset
248 return flowDepth - Math.rint(tkhValue / 2) / 100.0;
8940
82998242ba84 Preparing for additional outputs of SINFO-Tkh
gernotbelger
parents: 8938
diff changeset
249 }
82998242ba84 Preparing for additional outputs of SINFO-Tkh
gernotbelger
parents: 8938
diff changeset
250 }
8915
d9dbf0b74bc2 Refaktoring of flow depth calculation, extracting tkh part. First implementation of tkh calculation.
gernotbelger
parents:
diff changeset
251 }

http://dive4elements.wald.intevation.org