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@8915: import org.dive4elements.river.artifacts.sinfo.common.RiverInfoProvider; gernotbelger@8915: import org.dive4elements.river.artifacts.sinfo.tkhcalculation.Tkh; 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@8915: 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@8946: final Tkh tkh = this.tkhCalculator.getTkh(station); gernotbelger@8915: gernotbelger@8946: // REMARK: access the location once only during calculation gernotbelger@8946: final String location = this.riverInfoProvider.getLocation(station); gernotbelger@8915: gernotbelger@8946: // REMARK: access the gauge once only during calculation gernotbelger@8946: final String gaugeLabel = this.riverInfoProvider.findGauge(station); gernotbelger@8915: gernotbelger@8946: this.rows.add(new FlowDepthRow(tkh, this.wstLabel, gaugeLabel, this.bedHeightLabel, location)); gernotbelger@8915: } gernotbelger@8915: }