view flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/FlowVelocityCalculation.java @ 3181:de67497de5a0

Completed inverse functions. flys-artifacts/trunk@4796 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Tue, 26 Jun 2012 10:54:12 +0000
parents 4c00cf83fff1
children b888c5eb65b3
line wrap: on
line source
package de.intevation.flys.artifacts.model;

import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;

import de.intevation.flys.model.DischargeZone;
import de.intevation.flys.model.FlowVelocityModel;
import de.intevation.flys.model.FlowVelocityModelValue;
import de.intevation.flys.model.River;

import de.intevation.flys.artifacts.MINFOArtifact;
import de.intevation.flys.artifacts.model.FlowVelocityData;
import de.intevation.flys.utils.FLYSUtils;


public class FlowVelocityCalculation extends Calculation {

    private static final Logger logger =
        Logger.getLogger(FlowVelocityCalculation.class);


    public CalculationResult calculate(MINFOArtifact artifact) {
        logger.info("FlowVelocityCalculation.calculate");

        int[] mainIds  = artifact.getMainChannels();
        int[] totalIds = artifact.getTotalChannels();

        if (logger.isDebugEnabled()) {
            logger.debug("Artifact '" + artifact.identifier() + "' contains:");
            if (mainIds != null) {
                logger.debug("   " + mainIds.length + " main channel ids");
            }

            if (totalIds != null) {
                logger.debug("   " + totalIds.length + " total channel ids");
            }
        }

        List<DischargeZone>     zones  = getDischargeZones(mainIds, totalIds);
        List<FlowVelocityModel> models = getFlowVelocityModels(artifact, zones);

        return buildCalculationResult(artifact, models);
    }


    protected List<DischargeZone> getDischargeZones(
        int[] mainIds,
        int[] totalIds
    ) {
        List<DischargeZone> zones = new ArrayList<DischargeZone>();

        if (mainIds != null) {
            for (int id: mainIds) {
                DischargeZone zone = DischargeZone.getDischargeZoneById(id);

                if (zone != null) {
                    zones.add(zone);
                }
            }
        }

        if (totalIds != null) {
            for (int id: totalIds) {
                DischargeZone zone = DischargeZone.getDischargeZoneById(id);

                if (zone != null) {
                    zones.add(zone);
                }
            }
        }

        return zones;
    }


    protected List<FlowVelocityModel> getFlowVelocityModels(
        MINFOArtifact       artifact,
        List<DischargeZone> zones
    ) {
        River river = FLYSUtils.getRiver(artifact);

        List<FlowVelocityModel> models = new ArrayList<FlowVelocityModel>();

        for (DischargeZone zone: zones) {
            List<FlowVelocityModel> model =
                FlowVelocityModel.getModels(river, zone);

            if (model != null) {
                models.addAll(model);
            }
        }

        return models;
    }


    protected void prepareData(
        FlowVelocityData  data,
        FlowVelocityModel model,
        double kmLo,
        double kmHi
    ) {
        List<FlowVelocityModelValue> values =
            FlowVelocityModelValue.getValues(model, kmLo, kmHi);

        logger.debug("Found " + values.size() + " values for model.");

        for (FlowVelocityModelValue value: values) {
            data.addKM(value.getStation().doubleValue());
            data.addQ(value.getQ().doubleValue());
            data.addVTotal(value.getTotalChannel().doubleValue());
            data.addVMain(value.getMainChannel().doubleValue());
            data.addTauMain(value.getShearStress().doubleValue());
        }

        DischargeZone zone = model.getDischargeZone();
        String        lo   = zone.getLowerDischarge();
        String        hi   = zone.getUpperDischarge();

        if (lo.equals(hi)) {
            data.setZone(lo);
        }
        else {
            data.setZone(lo + " - " + hi);
        }
    }


    protected CalculationResult buildCalculationResult(
        MINFOArtifact           artifact,
        List<FlowVelocityModel> models
    ) {
        double kmLo = artifact.getDataAsDouble("ld_from");
        double kmHi = artifact.getDataAsDouble("ld_to");

        logger.debug("Prepare data for km range: " + kmLo + " - " + kmHi);

        FlowVelocityData[] data = new FlowVelocityData[models.size()];

        for (int i = 0, n = models.size(); i < n; i++) {
            FlowVelocityData d = new FlowVelocityData();

            prepareData(d, models.get(i), kmLo, kmHi);

            data[i] = d;
        }

        logger.debug("Calculation contains " + data.length + " data items.");

        return new CalculationResult(data, this);
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :

http://dive4elements.wald.intevation.org