All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.synerset.hvacengine.process.mixing.MixingStrategy Maven / Gradle / Ivy

package com.synerset.hvacengine.process.mixing;

import com.synerset.hvacengine.common.Validators;
import com.synerset.hvacengine.fluids.humidair.FlowOfHumidAir;
import com.synerset.unitility.unitsystem.flow.MassFlow;

import java.util.Arrays;
import java.util.Collection;

/**
 * The MixingStrategy interface defines methods for mixing multiple flows of humid air.
 * Implementations of this interface represent different strategies for mixing humid air, either with multiple recirculation flows or
 * with a single recirculation flow.
 */
public interface MixingStrategy {

    /**
     * Apply the mixing process and calculate the resulting flow of humid air.
     *
     * @return An AirMixingResult object representing the properties of the mixed air.
     */
    AirMixingResult applyMixing();

    /**
     * Get the inlet air flow properties.
     *
     * @return The FlowOfHumidAir representing the properties of the incoming air.
     */
    FlowOfHumidAir inletAir();

    /**
     * Get the list of recirculation air flow properties.
     *
     * @return A list of FlowOfHumidAir objects representing the properties of recirculation air flows.
     */
    Collection recirculationAirFlows();

    /**
     * Create a MixingStrategy instance based on the specified input parameters representing multiple recirculation air flows.
     *
     * @param inletAir              The incoming air flow properties.
     * @param recirculationAirFlows The list of recirculation air flows.
     * @return A MixingStrategy instance for mixing with multiple recirculation air flows.
     * @throws IllegalArgumentException If the input parameters are invalid.
     */
    static MixingStrategy of(FlowOfHumidAir inletAir, Collection recirculationAirFlows) {
        Validators.requireNotNull(inletAir);
        Validators.requireNotEmpty(recirculationAirFlows);
        MassFlow totalMassFlow = sumOfAllFlows(recirculationAirFlows).plus(inletAir.getMassFlow());
        Validators.requireBelowUpperBoundInclusive(totalMassFlow, FlowOfHumidAir.MASS_FLOW_MAX_LIMIT);
        return new MixingOfMultipleFlows(inletAir, recirculationAirFlows);
    }

    /**
     * Create a MixingStrategy instance based on the specified input parameters representing multiple recirculation air flows.
     *
     * @param inletAir              The incoming air flow properties.
     * @param recirculationAirFlows The recirculation air flows.
     * @return A MixingStrategy instance for mixing with multiple recirculation air flows.
     * @throws IllegalArgumentException If the input parameters are invalid.
     */
    static MixingStrategy of(FlowOfHumidAir inletAir, FlowOfHumidAir... recirculationAirFlows) {
        return new MixingOfMultipleFlows(inletAir, Arrays.asList(recirculationAirFlows));
    }

    /**
     * Create a MixingStrategy instance based on the specified input parameters representing a single recirculation air flow.
     *
     * @param inletAir             The incoming air flow properties.
     * @param recirculationAirFlow The recirculation air flow properties.
     * @return A MixingStrategy instance for mixing with a single recirculation air flow.
     * @throws IllegalArgumentException If the input parameters are invalid.
     */
    static MixingStrategy of(FlowOfHumidAir inletAir, FlowOfHumidAir recirculationAirFlow) {
        Validators.requireNotNull(inletAir);
        Validators.requireNotNull(recirculationAirFlow);
        MassFlow totalMassFlow = inletAir.getMassFlow().plus(recirculationAirFlow.getMassFlow());
        Validators.requireBelowUpperBoundInclusive(totalMassFlow, FlowOfHumidAir.MASS_FLOW_MAX_LIMIT);
        return new MixingOfTwoFlows(inletAir, recirculationAirFlow);
    }

    private static MassFlow sumOfAllFlows(Collection airFlows) {
        MassFlow resultingFlow = MassFlow.ofKilogramsPerSecond(0);
        for (FlowOfHumidAir flow : airFlows) {
            resultingFlow = resultingFlow.plus(flow.getMassFlow());
        }
        return resultingFlow;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy