gernotbelger@8915: /** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde gernotbelger@8915: * Software engineering by gernotbelger@8915: * Björnsen Beratende Ingenieure GmbH gernotbelger@8915: * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt gernotbelger@8915: * gernotbelger@8915: * This file is Free Software under the GNU AGPL (>=v3) gernotbelger@8915: * and comes with ABSOLUTELY NO WARRANTY! Check out the gernotbelger@8915: * documentation coming with Dive4Elements River for details. gernotbelger@8915: */ gernotbelger@8915: package org.dive4elements.river.artifacts.sinfo.flowdepth; gernotbelger@8915: gernotbelger@8915: import java.util.ArrayList; gernotbelger@8915: import java.util.Collection; gernotbelger@8915: gernotbelger@8915: import org.apache.commons.lang.math.DoubleRange; gernotbelger@9312: import org.dive4elements.river.artifacts.common.GeneralResultType; gernotbelger@8997: import org.dive4elements.river.artifacts.common.ResultRow; gernotbelger@8915: import org.dive4elements.river.artifacts.sinfo.common.RiverInfoProvider; gernotbelger@8948: import org.dive4elements.river.artifacts.sinfo.common.SInfoResultType; gernotbelger@8915: import org.dive4elements.river.artifacts.sinfo.tkhcalculation.TkhCalculator; gernotbelger@8915: import org.dive4elements.river.artifacts.sinfo.tkhstate.BedHeightsFinder; gernotbelger@8915: import org.dive4elements.river.artifacts.sinfo.util.WstInfo; gernotbelger@8915: gernotbelger@8915: /** gernotbelger@8915: * @author Gernot Belger gernotbelger@8915: */ gernotbelger@8915: final class FlowDepthCalculator { gernotbelger@8915: gernotbelger@8997: private final Collection rows = new ArrayList<>(); gernotbelger@8915: gernotbelger@8915: private final BedHeightsFinder bedHeight; gernotbelger@8915: gernotbelger@8915: private final TkhCalculator tkhCalculator; gernotbelger@8915: gernotbelger@8915: private final RiverInfoProvider riverInfoProvider; gernotbelger@8915: gernotbelger@8915: private final String bedHeightLabel; gernotbelger@8915: gernotbelger@8915: private final String wstLabel; gernotbelger@8915: gernotbelger@8946: public FlowDepthCalculator(final RiverInfoProvider riverInfoProvider, final String wstLabel, final BedHeightsFinder bedHeight, gernotbelger@8946: final TkhCalculator tkhCalculator) { gernotbelger@8915: gernotbelger@8915: this.riverInfoProvider = riverInfoProvider; gernotbelger@8946: this.wstLabel = wstLabel; gernotbelger@8915: gernotbelger@8915: this.bedHeight = bedHeight; gernotbelger@8915: this.tkhCalculator = tkhCalculator; gernotbelger@8915: gernotbelger@8915: this.bedHeightLabel = bedHeight.getInfo().getDescription(); gernotbelger@8915: } gernotbelger@8915: gernotbelger@8915: public FlowDepthCalculationResult execute(final String label, final WstInfo wstInfo, final DoubleRange calcRange) { gernotbelger@8915: gernotbelger@8915: final Collection stations = this.bedHeight.getStations(); gernotbelger@8915: for (final Double station : stations) { gernotbelger@8915: if (calcRange.containsDouble(station)) gernotbelger@8915: calculateResultRow(station); gernotbelger@8915: } gernotbelger@8915: gernotbelger@8946: final boolean hasTkh = this.tkhCalculator.hasTkh(); gernotbelger@8946: gernotbelger@8946: return new FlowDepthCalculationResult(label, wstInfo, this.bedHeight.getInfo(), hasTkh, this.rows); gernotbelger@8915: } gernotbelger@8915: gernotbelger@8915: private void calculateResultRow(final double station) { gernotbelger@8915: gernotbelger@8997: final ResultRow row = ResultRow.create(); gernotbelger@8948: gernotbelger@8948: row.putValue(SInfoResultType.waterlevelLabel, this.wstLabel); gernotbelger@8948: row.putValue(SInfoResultType.soundingLabel, this.bedHeightLabel); gernotbelger@8948: gernotbelger@8948: // REMARK: access the gauge once only during calculation gernotbelger@8948: final String gaugeLabel = this.riverInfoProvider.findGauge(station); gernotbelger@8948: row.putValue(SInfoResultType.gaugeLabel, gaugeLabel); gernotbelger@8915: gernotbelger@8946: // REMARK: access the location once only during calculation gernotbelger@8946: final String location = this.riverInfoProvider.getLocation(station); gernotbelger@9312: row.putValue(GeneralResultType.location, location); gernotbelger@8915: gernotbelger@8978: if (this.tkhCalculator.calculateTkh(station, row)) gernotbelger@8978: this.rows.add(row); gernotbelger@8915: } gernotbelger@8915: }