LoadVariationAreaAutomationSystem.java

/**
 * Copyright (c) 2024, RTE (http://www.rte-france.com)
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 * SPDX-License-Identifier: MPL-2.0
 */
package com.powsybl.dynawo.margincalculation.loadsvariation;

import com.powsybl.dynawo.builders.ModelConfig;
import com.powsybl.dynawo.models.AbstractPureDynamicBlackBoxModel;
import com.powsybl.dynawo.models.VarConnection;
import com.powsybl.dynawo.models.loads.DefaultControllableLoadModel;
import com.powsybl.dynawo.models.macroconnections.MacroConnectAttribute;
import com.powsybl.dynawo.models.macroconnections.MacroConnectionsAdder;
import com.powsybl.dynawo.parameters.ParametersSet;
import com.powsybl.iidm.network.Load;

import java.util.List;
import java.util.Objects;
import java.util.function.BiConsumer;
import java.util.function.Consumer;

import static com.powsybl.dynawo.parameters.ParameterType.*;

/**
 * @author Laurent Issertial {@literal <laurent.issertial at rte-france.com>}
 */
public class LoadVariationAreaAutomationSystem extends AbstractPureDynamicBlackBoxModel {

    private static final String ID = "LOAD_VARIATION_AREA";
    private static final String PAR_ID = "LOAD_VAR_AREA";
    private static final ModelConfig MODEL_CONFIG = new ModelConfig("DYNModelVariationArea");

    private final List<LoadsVariation> loadsVariations;
    private final double loadIncreaseStartTime;
    private final double loadIncreaseStopTime;
    private final BiConsumer<LoadsProportionalScalable, Double> scalingConfig;

    public LoadVariationAreaAutomationSystem(List<LoadsVariation> loadsVariations, double loadIncreaseStartTime,
                                             double loadIncreaseStopTime,
                                             BiConsumer<LoadsProportionalScalable, Double> scalingConfig) {
        super(ID, PAR_ID, MODEL_CONFIG);
        this.loadsVariations = Objects.requireNonNull(loadsVariations);
        this.loadIncreaseStartTime = loadIncreaseStartTime;
        this.loadIncreaseStopTime = loadIncreaseStopTime;
        this.scalingConfig = scalingConfig;
    }

    @Override
    public void createMacroConnections(MacroConnectionsAdder adder) {
        int index = 0;
        for (LoadsVariation lv : loadsVariations) {
            for (Load load : lv.loads()) {
                adder.createMacroConnections(this, load, DefaultControllableLoadModel.class, this::getVarConnectionsWith, MacroConnectAttribute.ofIndex1(index));
                index++;
            }
        }
    }

    private List<VarConnection> getVarConnectionsWith(DefaultControllableLoadModel connected) {
        return List.of(new VarConnection("DeltaPc_load_@INDEX@", connected.getDeltaPVarName()),
                new VarConnection("DeltaQc_load_@INDEX@", connected.getDeltaQVarName()));
    }

    @Override
    public void createDynamicModelParameters(Consumer<ParametersSet> parametersAdder) {
        ParametersSet paramSet = new ParametersSet(getParameterSetId());
        int index = 0;
        for (LoadsVariation lv : loadsVariations) {
            LoadsProportionalScalable proportionalScalable = new LoadsProportionalScalable(lv.loads());
            scalingConfig.accept(proportionalScalable, lv.variationValue());
            for (CalculatedLoadScalable load : proportionalScalable.getLoadScalable()) {
                paramSet.addParameter("deltaP_load_" + index, DOUBLE, String.valueOf(load.getCalculatedDeltaP()));
                paramSet.addParameter("deltaQ_load_" + index, DOUBLE, String.valueOf(load.getCalculatedDeltaQ()));
                index++;
            }
        }
        paramSet.addParameter("nbLoads", INT, String.valueOf(index));
        paramSet.addParameter("startTime", DOUBLE, String.valueOf(loadIncreaseStartTime));
        paramSet.addParameter("stopTime", DOUBLE, String.valueOf(loadIncreaseStopTime));
        parametersAdder.accept(paramSet);
    }

    @Override
    public void createNetworkParameter(ParametersSet networkParameters) {
        for (LoadsVariation lv : loadsVariations) {
            for (Load load : lv.loads()) {
                networkParameters.addParameter(load.getId() + "_isControllable", BOOL, Boolean.toString(true));
            }
        }
    }
}